class Test {
public:
operator string() {
return string{"TEST!"};
}
};
int main() {
cout << Test{};
}
Я ожидал, что тестовый объект будет неявно преобразуются в строку и выход, но он дает мне ошибку:неявного преобразования типа не работает
error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Это явное преобразование работает:
cout << string{Test{}};
Я получил это работает литьем в const char*
:
class Test {
public:
operator const char*() {
return "TEST!";
}
};
Тогда выход:
cout << Test{}; //Yay it works.
Я предполагаю, что cout << string
уже неявное преобразование из string
в char *
и если я использую литье в строку, она не будет выполнять преобразование в два уровня из Test to string to char *
. После прямого литья до const char*
он работает. (Пожалуйста, исправьте, если предположение неверно)
ДОКАЗАТЬ это предположение верно
class Test {
public:
operator string() {
return string{"TEST!"};
}
};
ostream& operator<< (ostream& os, string s){
os << s;
return os;
}
Это будет выполнять прямой вычет типа из Test to string
и строки вывода. и после того, как я попробовал, он работает!
cout << Test{}; //YAY WORKS! OUTPUT "TEST!"
Что-то особенное cout << string
объясняется Borgleader
. Предположение частично правильно и частично ошибочно.
У вас есть свои определения явного и неявного переключения. 'T {x}' * явно * указывает 'T', просто' x' в одиночку этого не делает. Ваша первая строка будет * неявно * конвертировать в строку. – GManNickG
@GManNickG да, они меня всегда путают .. Отредактировано. – texasbruce
Это должно помочь вам: http://stackoverflow.com/questions/17539555/why-does-outputting-a-class-with-a-conversion-operator-not-work-for-stdstring – chris