2012-05-29 2 views
3

Следующий код (это упрощенная версия того, что мне нужно) не связыватьTrivial специализация метод не работает (C++)

В * .h файле:

class InterfaceFunctionField2 { 
public: 
    template<class outputType> outputType to() { return outputType(); } 
}; 

В * .cpp file

template<> double InterfaceFunctionField2::to<double>() 
{ return 3.; } 

Этот класс находится в статической библиотеке.

Я получаю сообщение об ошибке LNK2005: "public: double __thiscall ИнтерфейсFunctionField2 :: to (void) const" (?? $ to @ N @ InterfaceFunctionField2 @@ QBENXZ), уже определенный в ... "и" второе определение проигнорировано»предупреждение LNK4006

Я определяю InterfaceFunctionField2 :: к() специализации только один раз, и я не #include * .cpp файлы ....

Я посмотрел в Интернете (e.g. here) и этот тип код выглядит нормально, но компоновщик не согласен. Не могли бы вы помочь? Благодарю.

ответ

5

Вам также необходимо объявить специализацию в заголовке.

//header.h 
class InterfaceFunctionField2 { 
public: 
    template<class outputType> outputType to() { return outputType(); } 
}; 

template<> double InterfaceFunctionField2::to<double>(); 

//implementation.cc 
template<> double InterfaceFunctionField2::to<double>() 
{ return 3.; } 

Код в вашей ссылке работает, потому что специализация видима для этой единицы перевода.

+0

Правильный ответ менее чем через минуту после того, как вопрос был отправлен! Очень впечатляет, большое спасибо. –

+0

@YuccaV рад помочь! –