Перегружен << Оператор в C++ не найден

Вот что меня беспокоит: у меня перегружены operator << в заголовочном файле FAPPDebug.h, например:

QTextStream& operator << (QTextStream& a, FAPPDebug& b);

и реализация в FAPPDebug.cpp:

QTextStream& operator << (QTextStream& a, FAPPDebug& b)
{
    QString msg = *b.stream->ts.string(); // just take the message from b
    a << msg;
    return a;
}

и соответствующий вызов функции:

QTextStream(stdout) << (debug() << "Quitting because application object is not set.");

независимо от того, как странно это выглядит, это компилируется (и работает!) под Windows с MSVC2010

debug() - это просто макрос для создания объекта FAPPDebug из текущего местоположения. Пожалуйста, обратите внимание на дополнительный набор () вокруг (debug() << "...") без того, что он не производит то, что я хочу.

На другом конце под Linux с g++ 4.4 я получаю следующую ошибку:

MessageBroker.cpp: 91: ошибка: нет совпадения для "operator <<" в QTextStream (stdout, QFlags ((QIODevice:: OpenModeFlag) 3u)) << ((FAPPDebug *) ((FAPPDebug *) FAPPDebug (417, ((const char *) "MessageBroker.cpp"), ((const char *) (& PRETTY_FUNCTION)), (LogLevel) 7u).FAPPDebug:: operator << (((const char *) "Модуль"))) - > FAPPDebug:: operator << (((const QString &) ((const QString *) (& ModuleBase:: getModuleDescription () ()))))) -> FAPPDebug:: operator << (((const char *) " Выход, потому что объект приложения не задан. ")) '/Usr/local/Trolltech/Qt-4.8.2/include/QtCore/qtextstream.h:184: note: кандидаты: FAPPDebug.h: 94: note: QTextStream & operator << (QTextStream &, FAPPDebug &)

(Есть много кандидатов, я просто сохранил то, что важно)

Я изменил вызов функции, чтобы быть:

::operator << (QTextStream(stdout),  debug() << "Failed to schedule application startup.");

и я получаю сообщение об ошибке:

MessageBroker.cpp: в функции-члене 'bool MessageBroker:: init (Application *, const QString &)': MessageBroker.cpp:91: ошибка: нет соответствующей функции для вызова оператора '<< (QTextStream, FAPPDebug &)' / usr / local /Trolltech/Qt-4.8.2/include/QtCore/qchar.h:396: примечание: кандидаты: QDataStream & operator << (QDataStream &, const QChar &) /home/ferenc/work/trunk/Core/Common/FAPPDebug.h: 94: примечание:
QTextStream & operator << (QTextStream &, FAPPDebug &)

так как вы можете видеть, что правильная функция найдена каждый раз (да, заголовок FAPPDebug.h включен в MessageBroker.cpp), но компилятору "более стандартно совместимого" не удалось его использовать. У меня такое ощущение, что это сбой в моем понимании стандарта где-то, поэтому я прошу вашей помощи, чтобы найти его.

РЕДАКТИРОВАТЬ: оператор объявлен в друзья class FAPPDebug

EDIT2: debug() является макросом и определяется следующим образом:

#define debug() FAPPDebug(__LINE__, __FILE__, __PRETTY_FUNCTION__, LOG_DEBUG)

то есть. он просто создал объект FAPPDebug с параметрами, указывающими текущую позицию.

Спасибо! е.

3 ответа

Решение

Я думаю, что проблема может заключаться в том, что ваш оператор вставки принимает ссылку (lvalue) в качестве первого параметра, как и ожидалось, но вы пытаетесь передать значение r, созданное автоматически из конструктора. Подумайте об этом, как вы ожидаете, что автоматически созданный QTextStream(stdout) будет содержать последовательность вызовов типа QTextStream(stdout) << a << b << c. По правде говоря, это x << a, затем x << b, затем x << c. Чтобы это происходило в одном предложении, я думаю, что и первое, и обратное должны быть константными ссылками, которые способны закрепить ваше значение. Или вы можете просто объявить переменную типа QTextStream qout(stdout) и использовать вместо нее qout.

Не должен второй параметр для вашего operator<< быть FAPPDebug const&? Вы не можете инициализировать неконстантную ссылку временным, даже если некоторые компиляторы все еще не могут обнаружить ошибку.

Если вы посмотрите внимательно, то функции, которые видит используемый компилятор, и то, что вы определили, не совпадают.

Что он видит:

no matching function for call to ‘operator<<(QTextStream, ...

Что это определило

QTextStream& operator<<(QTextStream&, ...

Кажется, что временный объект не может быть передан как неконстантная ссылка. Так что либо измените его на QTextStream const& или используйте ссылку rvalue.

РЕДАКТИРОВАТЬ: О хорошо, я только что понял, что поток, передаваемый в качестве первого параметра, не может быть константой. Использование ссылки на rvalue или просто поиск по значению, если это возможно, кажется мне единственным способом сделать это сейчас. Это ваш (debug() ...) объект, который вызывает проблему.

У меня была эта проблема, и это проблема любого новичка в C++.

QTextStream& operator << (QTextStream& a, FAPPDebug& b);

Это ваше заявление, но вы используете:

QTextStream(stdout) << (debug() << "Quitting because application object is not set.");

Я предполагаю, что у вас есть объект FAPPDEbug с оператором, который позволяет ему использовать оператор для указателя const char. так тогда это становится этим

QTextStream(stdout) << FAPPDebugObject; 

И ваш компилятор не найдет его в том случае, если FAPPDebugObject не был возвращен как ссылка, потому что вы запрашиваете аргумент ссылки в следующем операторе.

Я надеюсь, что это имело смысл для вас или для тех, кто ищет решение.

Другие вопросы по тегам