我在test.hpp中有一个模板化的类定义
///////////////////////////////////////////////
class point1 {
public:
int z0;
point1(): z0(1)
{}
};
///////////////////////////////////////////////
class point2 {
public:
int z1;
point2(): z1(2)
{}
};
///////////////////////////////////////////////
template <class T>
class line {
public:
T p1;
void printPoint(void);
};
并在实现文件test.cpp中我试图专门化类行的printPoint函数
///////////////////////////////////////////////
template<>
void line<point1>::printPoint(void)
{
cout<<p1.z0<<endl;
}
template <class T>
void line<T>::printPoint(void)
{
cout<<p1.z1<<endl;
}
//////////////////////////////////////
,主要功能在testmain.cpp
int main()
{
line<point1> r1;
line<point2> r2;
r1.printPoint();
r2.printPoint();
int abc;
cin>>abc;
return 0;
}
但链接器抛出了printPoint函数的多重定义错误。 如果不是如何专门化一个模板化类的成员函数,它是一个正确的类成员函数特化方法吗?请帮忙。
答案 0 :(得分:1)
因为只有在使用tipe实例化行类时才知道类型T,所以编译器不可能在cpp文件中知道稍后将使用的泛型类型T,因此它无法编译这些函数。这就是为什么你首先需要在头文件中移动这些函数的实现:
template <class T>
class line {
public:
T p1;
void printPoint(void)
{
cout<<p1.z1<<endl;
}
};
现在,上面的实现是针对泛型类型T,现在如果你想要特殊类型,请说point1
:
template <>
class line <point1> /*note this line changed*/ {
public:
point1 p1;
void printPoint(void)
{
cout<<p1.z0<<endl;
}
};