2012-07-16 57 views
0

我嘗試寫一些數學代碼的項目,我偶然發現了一個有趣的問題:在線模板功能

template<class T> class Radian; 
template<class T> class Degree; 

template <class T> 
class Radian 
{ 
public: 
    T mRad; 
public: 
    Radian(const Degree& d); 
}; 

template <class T> 
class Degree 
{ 
public: 
    T mDeg; 
public: 
    Degree(const Radian& d); 
}; 

inline Radian::Radian (const Degree& d) 
{ 

} 

inline Degree::Radian (const Radian& d) 
{ 

} 

注意,代碼是大,但我去掉不必要的功能,這樣你就可以更好地理解。

我明白模板是如何工作的,我知道它們是在編譯時生成的,但對於這個特殊的例子我並不完全理解我應該使用什麼語法。我意識到在構造函數中應該有一個模板參數,但我不知道如何編寫它。從我看到的,我可能不得不使用另一個模板,但它會很好使用相同的T,因爲我不會從Degree_float轉換爲Radian_double。

任何人都可以對此有所瞭解嗎?

謝謝。

回答

5

這是聲明的語法:

template <typename T> 
class Radian 
{ 
public: 
    Radian(Degree<T> const& degree); 
    … 
}; 

這是定義的語法:

template <typename T> 
inline Radian<T>::Radian(Degree<T> const& degree) { 
    … 
} 

也就是說,因爲你的類是一個模板,您需要指定其類型參數。構造函數是而不是模板,因此您可以像正常構造函數那樣編寫它,只需使用其類名前綴即可。

+0

並確保您已將所有模板化方法放入頭文件中。 – boto 2012-07-16 15:37:30

+0

..也許應該提到他/她在'inline Degree :: Radian(const Radian&d)' – 2012-07-16 15:38:39

+0

中使用了一個錯誤的構造函數名稱並取掉了內聯關鍵字,因爲模板是自動內聯的。 – blockchaindev 2012-07-16 15:39:11