![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
orlangur86 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.7.2008 Репутация: нет Всего: нет |
Доброго времени суток!
Объясните пожалуйста, если есть возможность, следующую ситуацию. Имеется шаблон класса, определенный в файле 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Потому что в заголовках можно определять только inline функции, иначе имеем в каждой единице трансляции копию функции.
не вдруг. не только не просил, а в явном виде определил функции ![]() короче - перед каждой функцией в SomeTpl.inl надо поставить inline или определить эти функции в отдельном .cpp |
|||
|
||||
orlangur86 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.7.2008 Репутация: нет Всего: нет |
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 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
в SpecCpp.cpp они должны быть не inline. "где он успел" обычно компилятор пишет. возможно осталась строчка #include "SomeTpl.inl" в SomeTpl.h
вот так:
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |