模板可能导致功能定义匹配失败

时间:2013-02-07 01:53:43

标签: c++ templates typename

在使用c ++ 11的VS2012中,为什么要编译:

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作为后面的模板函数定义,我只是用它来与第二个示例声明一致。
您是否不允许在模板类中使用与类不同的类型的函数?我非常有兴趣了解这里发生的事情以及我可以从这个错误中学到的与模板有关的任何内容。

2 个答案:

答案 0 :(得分: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); }

答案 1 :(得分:2)

您需要两个单独的模板声明:

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