2012-07-16 58 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