| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Специализрованные методы шаблонного класса |
| Автор: orlangur86 28.2.2010, 02:09 | ||||||||
| Доброго времени суток! Объясните пожалуйста, если есть возможность, следующую ситуацию. Имеется шаблон класса, определенный в файле SomeTpl.h Выглядит следующим образом:
Фактические определения методов в файле SomeTpl.inl
Как видно из кода, определения включают также специализацию методов some_op1 и some_op2 для типа int. Есть некий файл SomeCpp1.cpp внутри которого выполнено простое включение #include "SomeTpl.h" и ничего более. И есть файл TestPrj.cpp следующего содержания
Как видно, явно инстанцируется только версия класса для типа double. Ликовщик ругается и говорит, что 1>TestPrj.obj : error LNK2005: "public: void __thiscall SomeTpl<int>::some_op1(void)" (?some_op1@?$SomeTpl@H@@QAEXXZ) already defined in SomeCpp1.obj 1>TestPrj.obj : error LNK2005: "public: void __thiscall SomeTpl<int>::some_op2(void)" (?some_op2@?$SomeTpl@H@@QAEXXZ) already defined in SomeCpp1.obj В асм. листинге кода для TestPrj присутствует код для SomeTpl<int>::some_op1 и SomeTpl<int>::some_op2 т.е. специализация для int тоже вдруг оказывается инстанцированной, хотя об этом никто не просил. Почему так получается? Если задать отдельную специализацию для класса в таком виде:
то это прокатывает, но приходится дублировать уже написанное. Как с этим быть? Может я что-то не так понимаю? Заранее мерси |
| Автор: baldina 28.2.2010, 02:46 | ||
Потому что в заголовках можно определять только inline функции, иначе имеем в каждой единице трансляции копию функции.
не вдруг. не только не просил, а в явном виде определил функции короче - перед каждой функцией в SomeTpl.inl надо поставить inline или определить эти функции в отдельном .cpp |
| Автор: orlangur86 28.2.2010, 11:18 | ||
| baldina, спасибо! С inline-ом получилось. А вот на счет объявления специализаций в отдельном срр я не понял. Перенес эти специализации в отдельный SpecCpp.cpp
компилятор ругается speccpp.cpp(9) : error C2908: explicit specialization; 'void SomeTpl<Tp>::some_op1(void)' has already been instantiated with [ Tp=int ] speccpp.cpp(15) : error C2908: explicit specialization; 'void SomeTpl<Tp>::some_op2(void)' has already been instantiated with [ Tp=int ] где он уже успел инстанцировать эти методы для типа int? |
| Автор: baldina 28.2.2010, 17:50 | ||||||
| в SpecCpp.cpp они должны быть не inline. "где он успел" обычно компилятор пишет. возможно осталась строчка #include "SomeTpl.inl" в SomeTpl.h вот так:
|