C++ 模板可能导致函数定义匹配失败

C++ 模板可能导致函数定义匹配失败,c++,templates,typename,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

在使用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); }
模板
类向量2
{
公众:
Vector2();//构造函数
T点(常数矢量2&U,常数矢量2&V);
};
模板
内联T向量2::点(常量向量2&U,常量向量2&V)//问题
{返回(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); }
模板
类向量2
{
公众:
Vector2();//构造函数
模板
G点(常数矢量2&U,常数矢量2&V);
};
模板
内联G向量2::点(常量向量2&U,常量向量2&V)//问题
{返回(U.x*V.x+U.y*V.y);}
第二个导致错误:“无法将函数定义与现有声明匹配”
我意识到我不必在后面的模板函数定义中使用G,我只是使用它来与第二个示例声明保持一致。

是否不允许模板类中的函数采用与该类不同的类型?我非常有兴趣了解这里发生了什么,以及我可以从这个错误中学到的关于模板的任何相关信息。

您有两种模板类型:
T
G
。一个列表(
T
)用于类,一个列表(
G
)用于成员函数。因此,您必须有两个列表;一个用于类,然后一个用于函数(并确保正确的类型放在正确的位置,
T
在类名之后,参数中的
G
):

模板
模板
内联G向量2::点(常量向量2&U,常量向量2&V)
{返回(U.x*V.x+U.y*V.y);}

您有两种模板类型:
T
G
。一个列表(
T
)用于类,一个列表(
G
)用于成员函数。因此,您必须有两个列表;一个用于类,然后一个用于函数(并确保正确的类型放在正确的位置,
T
在类名之后,参数中的
G
):

模板
模板
内联G向量2::点(常量向量2&U,常量向量2&V)
{返回(U.x*V.x+U.y*V.y);}

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

template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}
模板
模板
内联G向量2::点(常量向量2&U,常量向量2&V){…}

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

template <class T>
template <class G>
inline G Vector2<T>::Dot(const Vector2<G>& U, const Vector2<G>& V) {...}
模板
模板
内联G向量2::点(常量向量2&U,常量向量2&V){…}

谢谢你们两位,我确信这是一件简单的事情,但不确定该怎么办,只是这件小事将来会对我有很大帮助。谢谢你们两位,我确信这件事很简单,但不确定该怎么办,只是这件小事将来会对我有很大帮助。