2013-12-17 166 views
0

我有一個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

@StoryTeller我不同意。 OP將在稍後遇到該問題,但目前的問題是他將模板定義放入'.cpp'文件中。 – pmr

回答

1

由於類型T只有在用一些tipe實例化行類時纔是已知的,因此編譯器不可能在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; 
    } 
};