我创建了一个定义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
会返回一个标量,不需要任何转换。
有任何解释吗?
答案 0 :(得分:1)
不是吗?
template<class Type> XY<Type> operator-(const Type& P, const Type& Q)
而不是
S
后者显然没有被称为。在函数operator -
中,编译器尝试为int
调用内置P
,因此尝试将参数Q
和int
转换为Process.Start("rundll32.exe", "shell32.dll, OpenAs_RunDLL ");
}(这是不可能的,因而错误)。