оператор << stackoverflow - PullRequest
       1

оператор << stackoverflow

7 голосов
/ 01 июня 2011

Рассмотрим следующий код:

class TextMessage{
public :
    TextMessage(){};
    TextMessage(std::string _text):text(_text){}
    std::string text;
    friend std::ostream & operator<<( std::ostream & os, const TextMessage & m);
};
std::ostream & operator<<( std::ostream & os, const TextMessage & m){
    return os << "text message : " << m.text;
}

Почему на земле:

  • Visual 2010 выдает C4717 предупреждение в операторе <<
  • делает std::cout << textMsgInstance; сбои в стеке, как и предсказывалось Visual?

Кстати, замена m.text на m.text.c_str() работает.

Ответы [ 3 ]

14 голосов
/ 01 июня 2011

Я предполагаю, что вам не удалось #include <string>. Таким образом, когда компилятор выводит std::string, он не может и начинает искать неявные преобразования - и ваш неявный конструктор в TextMessage выглядит просто как счет. Но подождите - теперь мы выводим TextMessage в функцию вывода TextMessage, и bam.

6 голосов
/ 01 июня 2011

Единственное, о чем я могу думать, это то, что у него нет оператора << для std :: string, поэтому он ищет преобразование и находит конструктор с одним аргументом TextMessage (std :: string). </p>

Часто рекомендуется предотвращать неожиданные вызовы конструкторов с одним аргументом, делая их явными.

explicit TextMessage(std::string _text):text(_text){}

Тогда он не будет рассматривать конструктор для неявных преобразований.

3 голосов
/ 01 июня 2011

Это потому, что m.text равно std::string, оно преобразуется внутри оператора в TextMessage и оператор вызывается снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...