这对于那里的 C++ 大师来说。
考虑以下代码:
class X { };
template <class T>
class Mistake {
public:
T x;
Mistake(const T& k) : x(k) { }
Mistake(const X&) : x(1) { }
void print() { cout << x << endl; }
};
template <class T>
Mistake<T> operator+(const Mistake<T>& a, const Mistake<T>& b)
{
return Mistake<T>(a.x + b.x);
}
我有一个类“错误”,我想对其进行加法操作。当我尝试:
X a, b;
Mistake<int> foo = a + b;
我得到一个编译错误;编译器似乎无法意识到必须实例化模板 operator+。
另一方面,如果我之前添加了以下代码:
Mistake<int> operator+(const Mistake<int>& a, const Mistake<int>& b)
{
return Mistake<int>(a.x + b.x);
}
那么一切都很好。有人知道为什么吗?我怀疑编译器无法弄清楚要实例化什么,因为需要从类 X 到类错误的类型转换,但我不知道如何解决这个问题,除非根本不使用模板。
顺便说一句,将类中的操作员定义为友元也行不通。
谢谢!