是否可以直接将 QString 提供给(例如)googletest 的 ADD_FAILURE() 宏?
Is it possible to directly feed a QString into (e.g.) googletest's ADD_FAILURE() macro?
我已经增强了我的 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" (...)
有没有办法进一步增强我的 gtest 以便能够直接使用 QStrings
,或者没有办法避免将那些 QStrings
包装在 qUtf8Printable()
中?
澄清:
写作 ADD_FAILURE() << qUtf8Printable(QString("Test!"));
和 ADD_FAILURE() << QString("Test!").toStdString();
.
一样有效
但是如果可以避免那些明确的 conversions/calls 会更好,例如通过启用 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> ]
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;
}
我已经增强了我的 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" (...)
有没有办法进一步增强我的 gtest 以便能够直接使用 QStrings
,或者没有办法避免将那些 QStrings
包装在 qUtf8Printable()
中?
澄清:
写作 ADD_FAILURE() << qUtf8Printable(QString("Test!"));
和 ADD_FAILURE() << QString("Test!").toStdString();
.
一样有效
但是如果可以避免那些明确的 conversions/calls 会更好,例如通过启用 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> ]
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;
}