2012-01-25 2 views
2

Пусть следующий код:Почему я не могу использовать оператор трансляции в сравнении?

#include <string> 
#include <iostream> 
using namespace std; 
struct A 
{ 
    operator int() 
    { 
     return 123; 
    } 
    operator string() 
    { 
     return string("abc"); 
    } 
}; 
void main() 
{ 
    A a; 
    cout<<(a==123)<<endl; 
    //cout<<(a==string("abc"))<<endl; 
} 

Первый, я сравниваю объект a с int переменной. Затем я пытаюсь сравнить его с переменной string, но файлы программы для компиляции. Когда строка, содержащая сравнение, прокомментирована, она просто компилируется. В чем проблема?

+2

Получите ошибку компилятора? Что он говорит? Это вам что-нибудь говорит? Как возможно, что для этих типов параметров нет '==' перегрузки оператора, доступной для этих типов параметров? –

+0

Попробуйте сделать такие операторы 'const' правильными, чтобы вы могли использовать их для' const A object; '. например, 'operator int() const {...}'. – iammilind

ответ

1

Вы предоставили оператор преобразования для вашего класса int, а также std::string,
Это обеспечивает преобразование происходит надлежащим образом.
Однако для == для работы сравниваемые типы должны иметь значение ==.
Язык содержит неявный == для int тип, но == перегрузка оператора для std::string и, следовательно, ошибка.

+0

Итак, в двух словах, «сравнение int - это языковая функция, но сравнение строк - это функция библиотеки»? –

+1

@KerrekSB: В двух словах сравнение 'std :: string' с использованием' operator == 'не требуется по спецификации языка, но, возможно, может быть функцией, предоставляемой библиотекой. –

+0

-1 Кажется, все это неправильно. Стандарт C++ описывает std :: string в порядке. И все это связано с тем, что 'operator ==' является шаблоном или нет, а не тем, что он является определяемой пользователем перегрузкой и встроенным. – UncleBens