2015-03-10 4 views
3

Я играю с каким-то C++-зелёным миром, и думал, что получаю qt-строки вихрем. Вторя и преобразующие строки прекрасно, но endl, кажется особенным:Почему не 'QTextStream (stdout) << endl;' компилировать, когда 'QTextStream (stdout) << "" << endl;' делает?

#include <QTextStream> 

int main(int, char*[]) 
{ 
    // Works, but is hacky (note: empty string): 
    // QTextStream(stdout) << "" << endl; 
    // Does not compile: 
    // QTextStream(stdout) << endl; 

    // Best? way (thanks to suy on #[email protected]): 
    QTextStream out(stdout); 
    out << endl; 

    return 0; 
} 

Итак, почему голый вызов QString(out) << end; не компилировать? Компилятор указывает, что для случая нет конверсии, но почему он правильно конвертирует с пустой строкой? Является ли это ошибкой в ​​qt или просто как C++ ищет шаблоны? Полная ошибка компилятора ниже.

Там в сути, и для того, чтобы тест:

mkdir qt 
cd qt 
wget https://gist.github.com/e12e/f79e9f0e66ee3600e0aa/raw/7ab8239060134601e93a0013706df638af0b3edf/qt.cpp 
cat qt.cpp #Check what you're compiling ;-) 
qmake -project 
qmake -makefile 
make 
./qt # outputs empty line 

Обратите внимание, что суть в вывешенных работах (выводит символ новой строки и выходы), вам необходимо изменить комментарии вокруг так, что линия с префиксом " не в состоянии собрать», чтобы получить сообщение об ошибке типа:

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I. -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -o qt.o qt.cpp 

qt.cpp: In function ‘int main(int, char**)’: 
qt.cpp:7:23: error: ambiguous overload for ‘operator<<’ (operand types are ‘QTextStream’ and ‘QTextStream&(QTextStream&)’) 
    QTextStream(stdout) << endl; 
        ^
qt.cpp:7:23: note: candidates are: 
In file included from /usr/include/x86_64-linux-gnu/qt5/QtCore/QTextStream:1:0, 
       from qt.cpp:1: 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:175:18: note: QTextStream& QTextStream::operator<<(QChar) <near match> 
    QTextStream &operator<<(QChar ch); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:175:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘QChar’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:176:18: note: QTextStream& QTextStream::operator<<(char) <near match> 
    QTextStream &operator<<(char ch); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:176:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘char’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:177:18: note: QTextStream& QTextStream::operator<<(short int) <near match> 
    QTextStream &operator<<(signed short i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:177:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘short int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:178:18: note: QTextStream& QTextStream::operator<<(short unsigned int) <near match> 
    QTextStream &operator<<(unsigned short i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:178:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘short unsigned int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:179:18: note: QTextStream& QTextStream::operator<<(int) <near match> 
    QTextStream &operator<<(signed int i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:179:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:180:18: note: QTextStream& QTextStream::operator<<(unsigned int) <near match> 
    QTextStream &operator<<(unsigned int i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:180:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘unsigned int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:181:18: note: QTextStream& QTextStream::operator<<(long int) <near match> 
    QTextStream &operator<<(signed long i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:181:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘long int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:182:18: note: QTextStream& QTextStream::operator<<(long unsigned int) <near match> 
    QTextStream &operator<<(unsigned long i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:182:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘long unsigned int’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:183:18: note: QTextStream& QTextStream::operator<<(qlonglong) <near match> 
    QTextStream &operator<<(qlonglong i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:183:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘qlonglong {aka long long int}’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:184:18: note: QTextStream& QTextStream::operator<<(qulonglong) <near match> 
    QTextStream &operator<<(qulonglong i); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:184:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘qulonglong {aka long long unsigned int}’ 
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:191:18: note: QTextStream& QTextStream::operator<<(const void*) <near match> 
    QTextStream &operator<<(const void *ptr); 
       ^
/usr/include/x86_64-linux-gnu/qt5/QtCore/qtextstream.h:191:18: note: no known conversion for argument 1 from ‘QTextStream&(QTextStream&)’ to ‘const void*’ 
make: *** [qt.o] Error 1 

ответ

6

Там есть перегрузки функций, таких как endl:

QTextStream &operator<<(QTextStream &s, QTextStreamFunction f); 

Требуется QTextStream ссылкой на константу без ссылки. QTextStream(stdout) является временным, и временные лица не могут привязываться к ним.

Там также функция перегрузки элемент для const char *:

QTextStream &operator<<(const char *c); 

Обратите внимание, как это возвращает ссылку (которая будет болтаться, как только полное выражение будет сделано, но хорошо до тех пор, пока результат используется только в прикован операторов и т. д.). Эта ссылка позволяет вызвать первую указанную перегрузку, тогда как временная - нет.

Лично я бы выбрал ваш последний вариант, если нет лучшего способа, о котором я не знаю (я не использовал Qt). Этот параметр аналогичен стандарту с std::cout, но вместо того, чтобы быть глобальной переменной, вы определяете его.

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