模板

2013-02-07 18 views
0

在VS2012使用C++ 11可能会导致功能定义匹配失败,为什么这个编译:模板

template <typename T> 
class Vector2 
{ 
public: 
    Vector2(); //constructors 

    T Dot(const Vector2<T>& U, const Vector2<T>& V); 
}; 

template <typename T> 
inline T Vector2<T>::Dot(const Vector2<T>& U, const Vector2<T>& V) //ISSUE 
{ return (U.x * V.x + U.y * V.y); } 

但这并不:

template <typename T> 
class Vector2 
{ 
public: 
    Vector2(); //constructors 

    template<typename G> 
    G Dot(const Vector2<G>& U, const Vector2<G>& V); 
}; 

template <typename G> 
inline G Vector2<G>::Dot(const Vector2<G>& U, const Vector2<G>& V) //ISSUE 
{ return (U.x * V.x + U.y * V.y); } 

第二个导致错误:“无法将函数定义与现有声明匹配“
我意识到我不需要将G用于后面的模板函数定义,我只是用它来与第二个示例声明一致。
您是否被允许在模板类中使用与该类不同的类型的函数?我非常有兴趣了解这里发生了什么,以及我可以从这个错误中学到的有关模板的任何相关信息。

回答

4

您有两种模板类型:TG。一个列表(T)用于该类,另一个列表(G)用于成员函数。因此,你必须有两个列表;一个班级,然后一个功能(并确保正确的类型走在正确的地方,T类名后G在参数):

template<typename T> 
template<typename G> 
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) 
{ return (U.x * V.x + U.y * V.y); } 
+0

谢谢你们两位,我确信它是一件简单的事,但不知道该怎么办,只是这件小事在将来会帮助我很多。 –

2

需要两个独立的模板声明:

template <class T> 
template <class G> 
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}