описание тела шаблонов

Тема в разделе "LANGS.C", создана пользователем cupuyc, 25 июл 2009.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    собственно я описываю шаблон в файле f.h:

    Код (Text):
    1. template <typename T>
    2. class A
    3. {
    4. private:
    5.     int x;
    6. public:
    7.     A(T t);
    8. };
    определяю методы в файле f.cpp:

    Код (Text):
    1. template <typename T>
    2. A<T>::A(T t)
    3. {
    4.     x = t;
    5. }
    в файле main.cpp вызываю его:

    Код (Text):
    1. void Main()
    2. {
    3.     A<long> a(3);
    4. }
    в итоге получаю:
    1>test.obj : error LNK2019: unresolved external symbol "public: __thiscall A<long>::A<long>(long)" (??0?$A@J@@QAE@J@Z) referenced in function "void __cdecl Main(void)" (?Main@@YAXXZ)

    я подумал - в принципе логично. ведь шаблон - просто определение. понятно что компилятор никак не может скомпилить код для какого-то абстрактоного типа T.

    собственно вопрос: все методы должны быть определены в f.h? в cpp'шник никак нельзя вынести? то есть должно быть так в файле f.h:

    Код (Text):
    1. template <typename T>
    2. class A
    3. {
    4. private:
    5.     int x;
    6. public:
    7.     A(T t)
    8.     {
    9.         x = t;
    10.     }
    11. };
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Именно так. Хотя можно оставить в cpp и сделать явную специализацию:
    Код (Text):
    1. f.cpp
    2.     template <typename X>
    3.     class A { bla-bla-bla };
    4.     ...
    5.     template<>
    6.     class A<long>;
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Есть ещё экспорт шаблонов, но он большинством компиляторов не поддерживается. Ленятся разрабы :)
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А чего ленятся то? Надо понимать что шаблоны не классы, а улучшенные макросы и для их конкретизации компилятор должен видеть реализацию. По-этому export - баловство.
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    сам ты улучшенный макрос %)

    проблема в том, что в пределах С++, при генерации кода во время линковки, все замечательно реализуется.
    но как только ты пытаешься скомпилить свой модуль в .obj или .lib и потом к чему-нибудь его подключить, то нужной специализации там не окажется
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Не понимаю, при чём здесь специализация. Случаем не путаешь чего? Подключить к чему? К Дельфи?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    экспортируемые шаблоын не поддерживаются мсвц точно. насчет остальных хз
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    к чему угодно, хоть к тому же С++
    специализация при том, что если в .obj она будет - то ОК, если не будет - то unresolved external symbol
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Специализация лишь частный случай, принципиально ничего не меняющий. Не спорю у экспорта есть некоторые плюсы, но лично мне они не кажутся существенными. Так важно хранить определения шаблонов в cpp? Или как обычно у нас сверхсекретная реализация?
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Booster

    Ну можно конечно и про инкапсуляцию начать говорить и прочие религиозные штуки. В целом я согласен и меня реализация в *.hpp методов не напрягает.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Религия конечно хорошо. Только некоторые забывают что конкретизирует компилятор, а не линковщик и это правильно.
     
  12. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Шаблоны должны быть реализованы в одном файле и это точка(на то они и шаблоны).
    Мне вот итерестно то должно происходить
    .hpp
    Код (Text):
    1. <template>
    2. class SomeClass
    3. {
    4. //Бла-бла-бла
    5. //Бла-бла-бла
    6. //Бла-бла-бла
    7. };
    Код (Text):
    1. .cpp
    2. //Не которая реализация
    Компилим как library(статическую аль динамическую)

    В другой проект включаем .h файл
    SomeClass<some type> gg;
    Интересно где компилятор будет брать код для типа "some type", компиляции шаблонного класса он не чего и не знал, какой ему тип данных передадут. То и есть код не будет для "some type".
     
  13. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    а меня несколько напрягает. у меня сейчас проект - там куча классов основана на одном и том-же шаблоне, но с разными базовыми типами. в результате чтобы поставить бряк на какой-нибудь метод шаблоны - нужно прождать минут 5, пока студия найдёт все реализации шаблона т куски кода где этот бряк должен стоять. вот я и думаю - есть ли тут какой-нибудь выход.
     
  14. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    У тебя там:
    Код (Text):
    1. int x;
    А надо:
    Код (Text):
    1. T x;
     
  15. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    спасибо за уточнение. очень полезное в данном вопросе.