2012-06-15 3 views
1

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

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 с г ++ 4.4, я получаю следующее сообщение об ошибке:

MessageBroker.cpp:91: error: no match for ‘operator<<’ in ‘QTextStream(stdout, QFlags((QIODevice::OpenModeFlag)3u)) << ((FAPPDebug*)((FAPPDebug*)FAPPDebug(417, ((const char*)"MessageBroker.cpp"), ((const char*)(& PRETTY_FUNCTION)), (LogLevel)7u).FAPPDebug::operator<<(((const char*)"Module")))->FAPPDebug::operator<<(((const QString&)((const QString*)(& ModuleBase::getModuleDescription()())))))->FAPPDebug::operator<<(((const char*)"Quitting because application object is not set."))’ /usr/local/Trolltech/Qt-4.8.2/include/QtCore/qtextstream.h:184: note: candidates are: FAPPDebug.h:94: note: QTextStream& operator<<(QTextStream&, FAPPDebug&)

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

Я модифицировал вызов функции будет:

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

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

MessageBroker.cpp: In member function ‘bool MessageBroker::init(Application*, const QString&)’: MessageBroker.cpp:91: error: no matching function for call to ‘operator<<(QTextStream, FAPPDebug&)’ /usr/local/Trolltech/Qt-4.8.2/include/QtCore/qchar.h:396: note: candidates are: QDataStream& operator<<(QDataStream&, const QChar&) /home/ferenc/work/trunk/Core/Common/FAPPDebug.h:94: note:
QTextStream& operator<<(QTextStream&, FAPPDebug&)

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

EDIT: оператор объявлен в другом class FAPPDebug

EDIT2: отладки() является макросом, и определяется как:

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

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

Спасибо! f.

ответ

1

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

1

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

+0

не все еще не работает, в этом случае он обнаруживает 'FAPPDebug.h: 94: note: QTextStream & operator << (QTextStream &, const FAPPDebug &)' функция, но все равно не делает соединение – fritzone

+0

Каков тип ' отладки() '? Если это не константная ссылка на 'QTextStream', ваша функция не может быть вызвана. С помощью 'const' правый операнд может быть временным (включая результаты неявного преобразования). –

1

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

Что он видит:

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

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

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

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

EDIT: Ну, я просто понял, что поток, прошедший как первый параметр, не может быть const. Использование ссылки rvalue или просто ловли по значению, если это возможно, кажется мне единственным способом сделать это сейчас. Это ваш объект (debug() ...), который вызывает проблему.

Смежные вопросы