如何专门化一个模板化课程的成员功能?

时间:2013-12-17 13:15:15

标签: c++

我在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函数的多重定义错误。 如果不是如何专门化一个模板化类的成员函数,它是一个正确的类成员函数特化方法吗?请帮忙。

1 个答案:

答案 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;
    }
};