Можно ли напрямую вставить QString в (например) макрос ADD_FAILURE () googletest? - PullRequest
0 голосов
/ 12 сентября 2018

Я уже улучшил свою среду googletest для обработки нескольких типов Qt, таких как QString (подробнее см. этот вопрос ).

inline void PrintTo(const QString& str, ::std::ostream* os)
{
    *os << "<" << qUtf8Printable(str) << ">";
}

Это прекрасно работает для большинстваМакросы gtest, такие как EXPECT_EQ и т. д.

Однако, когда я пытаюсь напрямую передать QString, например, в макрос ADD_FAILURE(), компилятор жалуется ...

//...
ADD_FAILURE() << QString("Test!");
//...    

gtest-message.h(131): error C2679: Binary Operator "<<": Could not find an operator that accepts "const QString" (...)

Есть ли способулучшите мой тест, чтобы иметь возможность напрямую использовать QStrings, или нет способа избежать включения этих QStrings в qUtf8Printable()?

Для уточнения:
Запись ADD_FAILURE() << qUtf8Printable(QString("Test!")); работает, какADD_FAILURE() << QString("Test!").toStdString();.
Но было бы намного лучше, если бы можно было избежать этих явных преобразований / вызовов, например, включив ADD_FAILURE() для прямой обработки QString.(Дублирование кода плохое - даже если это только один дополнительный короткий вызов функции для записи каждый раз, вы можете ожидать повторения конструкции для тысяч тестов ...)

Вот выдержка из необработанного (непереведенного) сообщения об ошибке (все сообщение об ошибке состоит из 132 строк, перечисляющих, с чем компилятор не может сопоставить функцию)

2>c:\development\external\googletest\include\gtest\gtest-message.h(131): error C2679: Binärer Operator "<<": Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ "const QString" akzeptiert (oder keine geeignete Konvertierung möglich)  
2>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(495): note: kann "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(std::basic_streambuf<char,std::char_traits<char>> *)"  
2>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(475): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(const void *)"  
2>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(455): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<(long double)" sein  
 ... **(snip)** ...  
2>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(981): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>,T>(std::basic_ostream<char,std::char_traits<char>> &&,const _Ty &)"  
2>          with  
2>          [  
2>              T=QString,  
2>              _Ty=QString  
2>          ]  
2>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\ostream(1019): note: oder "std::basic_ostream<char,std::char_traits<char>> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const std::error_code &)"  
2>  c:\development\external\googletest\include\gtest\gtest-message.h(131): note: bei Anpassung der Argumentliste "(std::stringstream, const QString)"  
2>  c:\development\test\src\codetest.cpp(390): note: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "testing::Message &testing::Message::operator <<<QString>(const T &)".  
2>          with  
2>          [  
2>              T=QString  
2>          ] 

1 Ответ

0 голосов
/ 12 сентября 2018

QString не предоставляет связанный не член для потоковой вставки, что является причиной вашей проблемы. (компилятор не находит никакой бинарной операторной функции, принимающей const QString & в качестве параметра)

См. Этот вопрос, связанный с вашей проблемой: Оператор << для QString </a>

Я полагаю, что у вас есть в вашем конфигурационном файле Qt

 DEFINES += QT_NO_CAST_TO_ASCII 

, который запрещает компилятору преобразовывать вашу QString в символ *

В этом случае вы можете написать где-нибудь этот глобальный оператор

std::ostream & operator<<(std::ostream & stream, const QString & str)
{
    const QByteArray data = str.toUtf8();
    stream << std::string(data.constData(), data.size());
    return stream;
}
...