cout вновь созданный объект выдает ошибку во время выполнения - PullRequest
0 голосов
/ 23 января 2020

В настоящее время я изучаю c ++, и я борюсь с примером, который предоставил наш преподаватель. Он создает новый Объект («Штрудель») и немедленно выводит его.

cout<<Strudel{"Nuss"};

это создает ошибку во время выполнения.

operator<<(basic_ostream<_CharT, _Traits>& __os,
    ^
/usr/...../include/c++/9/ostream:548:5: note: candidate template ignored: could not match 'const _CharT *' against 'Strudel'
    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)

Я также не уверен, работает ли это вообще. Я не нашел ни одного учебника, который бы делал так, кроме того, что мы видели в классе.

#include<iostream>

using namespace std;


    class Strudel{
        public:
            string Inhalt;

        Strudel(string x):Inhalt{x}{
            if(Inhalt.size()==0){
                throw runtime_error("kein Name!");
            }
        }

    ostream& print(ostream & os){
        return os<<this->Inhalt<<"-Strudel";
    }           

    };



    ostream & operator<<(ostream &os, Strudel &s){
        return s.print(os);
    }



int main(){

    Strudel x{"Mohn"};
    cout<<x<<endl;

    cout<<Strudel{"Nuss"};
    return 0;
}

1 Ответ

3 голосов
/ 23 января 2020

Strudel{"Nuss"} - это временное значение, оно не может быть привязано к неконстантным ссылкам (хотя Visual Studio по ошибке допускает это).

Вам необходимо исправить сигнатуру вашего оператора, чтобы получить константу ссылка:

ostream & operator<<(ostream &os, const Strudel &s){

Затем вам также необходимо пометить print как const, чтобы его можно было вызвать из ссылки const:

ostream& print(ostream & os) const{
...