gpt4 book ai didi

c++ - 类/函数模板组合的意外诊断

转载 作者:行者123 更新时间:2023-11-28 05:02:37 27 4
gpt4 key购买 nike

我创建了一个定义二维 vector 类型的类模板,其中的成员具有可变数据类型。

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 返回一个不需要任何转换的标量。

有什么解释吗?

最佳答案

你不是说

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

代替

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

后者显然没有被调用。在函数 S 中,编译器尝试为 int 调用内置的 operator - 并因此尝试转换参数 PQ 转换为 int(这是不可能的,因此是错误的)。

关于c++ - 类/函数模板组合的意外诊断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45554940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com