У меня есть следующее определение класса:Операторов для непримитивных штучных типов
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;
Когда я пытаюсь использовать операторы на свои определениях типов, как этого
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
и это происходит с любым другим, не primitve бокса (например, MyBox<float>
работает, но MyBox<std::map<int,int> >
не Почему это так
Это особенно для меня неясным, потому что для.? первое и второе сравнения operator T()
используется - почему не может быть, что делается автоматически для MyString
а
UPDATE: есть простое решение этой проблемы, кроме обеспечения конкретных операторов для каждого непримитивных шаблона? А что делать с MyString("a") == std::string("a")
?
@LogicStuff, замечательный материал! Спасибо, что нашел. – SergeyA
Я действительно не уверен в закрытии. Дубликат объясняет «почему», но не «как исправить». – SergeyA
@SergeyA Как исправить это довольно очевидно (нет 'operator ==', поэтому вам нужно написать один). Почему гораздо более интересный/трудный вопрос. – Barry