是否可以将QString直接输入(例如)googletest的ADD_FAILURE()宏中?

时间:2018-09-12 10:37:17

标签: c++ qt googletest

我已经增强了googletest环境,以处理少数Qt类型,例如QString(有关更多详细信息,请参见this question)。

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

这对于大多数EXPECT_EQ等gtest宏都适用。

但是,当我尝试直接将QString传递到例如ADD_FAILURE()宏,编译器抱怨...

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

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

是否有办法进一步增强我的gtest以使其能够直接使用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 :(得分:1)

QString没有为流插入提供相关的非成员,这就是问题的原因。 (编译器找不到任何接受const QString&作为参数的二进制运算符)

查看与您的问题有关的此问题: Operator << for QString

我想你在Qt配置文件中了

 DEFINES += QT_NO_CAST_TO_ASCII 

阻止编译器将您的QString转换为char *

在这种情况下,您可以在此全局运算符的某处编写

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