【发布时间】:2016-03-17 13:52:35
【问题描述】:
我有以下类定义:
template <typename T>
class MyBox {
public:
MyBox(T value) { _value = value; }
operator T() const { return _value; }
private:
T _value;
};
typedef MyBox<int> MyInt;
typedef MyBox<std::string> MyString;
当我尝试像这样在我的 typedef 上使用运算符时
bool first = MyInt(1) == MyInt(1); // works
bool second = std::string(MyString("a")) == std::string(MyString("a")); //works
bool third = MyString("a") == MyString("a"); // does not compile
编译器抱怨第三次比较
没有运算符“==”匹配这些操作数。操作数类型为:MyString == MyString
这发生在任何其他非原始拳击中(例如,MyBox<float> 有效,但 MyBox<std::map<int,int> > 无效。为什么会这样?
这对我来说尤其不清楚,因为在第一次和第二次比较中使用了 operator T() - 为什么不能自动为 MyString 完成?
更新:除了为每个非原始模板提供特定的运算符之外,是否有一个简单的解决方案?还有MyString("a") == std::string("a")怎么办?
【问题讨论】:
-
@LogicStuff,好东西!感谢您找到它。
-
不过,我不太确定是否关闭。副本解释了“为什么”,但没有解释“如何解决”。
-
@SergeyA 如何修复非常明显(没有
operator==,所以你必须写一个)。为什么是更有趣/更困难的问题。 -
@Barry,我同意“为什么”是更有趣的问题(例如,我不知道为什么)。但是,OP 已经直接寻求帮助:
UPDATE: Is there a simple solution to this other than providing the specific operators for each non-primitive template? And what to do with MyString("a") == std::string("a")。我试图解决这个问题。 -
@RobK 它是stackoverflow.com/q/35544648/1531708,对我来说它仍然出现在“已链接”下方的左侧
标签: c++ templates c++11 boxing