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

标签 c++ templates typename

在 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,我只是用它来与第二个示例声明保持一致。
您是否不允许在模板类中使用与类不同类型的函数?我非常想知道这里发生了什么,以及我可以从这个错误中学到的与模板相关的任何内容。

最佳答案

您有两种模板类型: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); }

关于c++ - 模板可能导致函数定义匹配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14742263/

相关文章:

c++ - C/C++ : -msse and -msse2 Flags do not have any effect on the binaries?

ruby - 如何使用 Ruby 和 Builder::XMLMarkup 模板生成 XML 文件?

java - 在 FreeMarker 中发出错误信号

c++ - 为什么即使模板类型声明为 `typename` 仍然需要 `class` ?

c++ - 在模板定义中要求类型名的原因

c++ - 在 C++ 中根据模板参数的类型初始化变量

c++ - 带有字符串变量指令的 C/C++ 内联汇编程序

c++ - 创建一个DLL Delphi,它导出C++类

c++ - wxWidgets 关闭时出现段错误

c++ - 调用模板类构造函数