使用类/函数模板组合的意外诊断

时间:2017-08-07 20:10:21

标签: c++ visual-studio

我创建了一个定义2D矢量类型的类模板,其中成员具有可变数据类型。

template<class Type> struct XY
{
    Type X, Y;
    XY() {}
    XY(Type X, Type Y): X(X), Y(Y)
    Type Square() const { return (X * X + Y * Y); }
};

此外,我重载了减号运算符并定义了一个额外的S函数。

template<class Type> XY<Type> operator-(const Type& P, const Type& Q)
{ return XY<Type>(P.X - Q.X, P.Y - Q.Y); }
template<class Type> Type S(const XY<Type>& P, const XY<Type>& Q)
{ return (P - Q).Square(); }

现在,在VS2008:

下,下面的代码无法编译
void main()
{
    struct XY<int> P, Q;
    S(P, Q);
}

最让我困惑的是错误信息,说

Error   1   error C2440: 'return' : cannot convert from 'XY<Type>' to 'int' 

在定义函数S的行中。

减法的结果显然是struct XY,应用于它的方法Square会返回一个标量,不需要任何转换。

有任何解释吗?

1 个答案:

答案 0 :(得分:1)

不是吗?

template<class Type> XY<Type> operator-(const Type& P, const Type& Q)

而不是

S

后者显然没有被称为。在函数operator -中,编译器尝试为int调用内置P,因此尝试将参数Qint转换为Process.Start("rundll32.exe", "shell32.dll, OpenAs_RunDLL "); }(这是不可能的,因而错误)。