【发布时间】:2013-05-05 12:33:47
【问题描述】:
如果是 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 到类 Mistake 的类型转换,但我不知道如何解决这个问题,除非根本不使用模板。
顺便说一句,将类中的操作符定义为友元也行不通。
谢谢!
【问题讨论】:
-
我在这里遗漏了什么吗?你没有为
X重载operator+。但是您正在尝试添加两个Xs -
@Named 没关系,因为有一个
Mistake构造函数接受X & -
@Named:我试图解释我的回答中发生了什么
-
@wroniasty 如果这样的转换有效,那么很多事情都不会有效,例如
std::is_floating_point,因为ints 被提升为floats 等等。但我认为@Andy 解释得更好。
标签: c++ templates overloading operator-keyword