Способ печати карты мультикарт?

Я пытаюсь перегрузить operator<<, и это сводит меня с ума:

std::ostream& operator<<(std::ostream & lhs, TuringMachine::TRTable& rhs){

    for(auto& statePtr : rhs){

        lhs << statePtr.first->getLabel().toStdString();
        for(auto& charPtr: statePtr.second){

            //lhs << '\t';
            lhs << charPtr.first.toAscii() ;
            //lhs << 'b ';
            lhs << charPtr.second.getState().getLabel().toStdString() << std::endl;
        }
    }

return lhs;
}

TRTable это typedefдля std::map<State*, std::multimap<QChar, Transition>>. Stateимеет метку QString, отсюда и вызов .toStdString().

В другом классе я вызываю std::cout << machine->table << std::endl;, где machine является TuringMachine*, и это дает мне

error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'

Что я делаю неправильно? Почему &&?

РЕДАКТИРОВАТЬ: используя g++ 4.6 и -std=c++0x


person TeaOverflow    schedule 26.05.2012    source источник
comment
Какие типы возвращают toStdString и toAscii? Знаете ли вы, для какой строки сообщение об ошибке?   -  person Scott Langham    schedule 26.05.2012
comment
toStdString() и toAscii() являются функциями-членами QString и QChar. Они возвращают std::string и char соответственно. Ошибка возникает в строке, где я вызываю std::cout << machine->table << std::endl   -  person TeaOverflow    schedule 26.05.2012
comment
Видно ли объявление этой функции operator<< с того места, где вы пытаетесь ее использовать? (Ранее в том же файле или в заголовке #included)   -  person aschepler    schedule 26.05.2012
comment
Похоже, вы изменили некоторые вещи. Выполним синхронизацию с SSCCE.   -  person Potatoswatter    schedule 26.05.2012
comment
Из ответов здесь: stackoverflow.com/questions/10651161/ Звучит похоже. Компилятор может по какой-то причине не учитывать ваш оператор. Это делает предложение aschepler очень хорошим!   -  person Scott Langham    schedule 26.05.2012
comment
@aschepler Когда я помещал это в заголовок, я получал несколько ошибок в определениях. Я читал о том, как сделать это inline, и теперь это работает! Спасибо! Но почему не хватило охранников заголовочного файла?   -  person TeaOverflow    schedule 26.05.2012


Ответы (3)


В каком пространстве имен вы объявили operator<<? Так как TRTable является typedef, ADL не применяется, поэтому operator<< ищется только в namespace std по ADL, так как именно здесь определяется фактический класс. Таким образом, вам может понадобиться use пространство имен, в котором вы определили operator<<, когда захотите его использовать.

person Florian Sowade    schedule 26.05.2012
comment
К моему стыду, я должен признать, что просто поместил его в файл .cpp. Я пытался избежать ошибки множественного определения и совершенно не знал о том, что я могу сделать это, оставив его в заголовке и добавив к нему префикс inline, и все будет хорошо. Как сейчас :-) - person TeaOverflow; 26.05.2012

lhs должен иметь тип std::ostream &. № 3_.

person chys    schedule 26.05.2012
comment
Извините, вставил устаревшую версию функции. В моем реальном коде нет `const`. Обновлено - person TeaOverflow; 26.05.2012

rhs должно быть const TuringMachine::TRTable&:

std::ostream& operator<<(std::ostream& lhs, const TuringMachine::TRTable& rhs)
person Community    schedule 26.05.2012