Ваш метод fun2()
является , а не template
методом, как сам по себе, хотя он является членом класса template
.Я не нахожу правильный технический термин, но в простых словах специализация fun2()
создаст эффект определения нормальной функции.Помещение определения в заголовочный файл приведет к множественной ошибке определения.
Чтобы решить эту проблему, просто введите ключевое слово inline
, и ошибка компоновщика исчезнет!
template <> inline // <----- 'inline' will prompt to generate only 1 copy
void A<char*>::fun2(char* val1, char* val2)
{
// some task 2 specific to char*;
}
Редактировать : устраняет ошибку компоновщика.Но все равно вы не можете использовать A<char*>::fun2
.В конечном итоге все сводится к тому факту, что вам необходимо специализировать всю class A<char*>
или перегрузку fun2(char*, char*)
в пределах A<T>
template<class T>
class A
{
// constructors
public:
//...
void fun2(char* val1, char* val2)
{
//specific case when T = char*
}
};