sas*_*alm 6 c++ qt unit-testing linker-errors
我正在探索Qt的单元测试框架,我注意到一件奇怪的事情 - 考虑到QString已经实现了相等运算符const char *,我本来希望QCOMPARE(QString("1"), "1")它可以工作,但它会导致链接器错误:
tst_untitled14test.obj:-1: error: LNK2019: unresolved external symbol "bool __cdecl QTest::qCompare<class QString,char const [2]>(class QString const &,char const (&)[2],char const *,char const *,char const *,int)" (??$qCompare@VQString@@$$BY01$$CBD@QTest@@YA_NABVQString@@AAY01$$CBDPBD22H@Z) referenced in function "private: void __thiscall Untitled14Test::testCase1(void)" (?testCase1@Untitled14Test@@AAEXXZ)
Run Code Online (Sandbox Code Playgroud)
示例代码:
QVERIFY(QString("1") == "1"); // This works.
QCOMPARE(QString("1"), QString("1")); // This works.
// QCOMPARE(QString("1"), "1"); // Causes a linker error!
Run Code Online (Sandbox Code Playgroud)
这是为什么?不QCOMPARE使用2项的等式运算符?
编辑:由于在评论中询问,该项目是由Qt Creator的单元测试向导(文件 - >新项目 - >其他项目 - > Qt单元测试)创建的,所以当然它已经正确设置,并QT += testlib包含在内.
Mee*_*fte 10
从Qt 文档
QCOMPARE对数据类型非常严格.实际和预期都必须是相同的类型,否则测试将无法编译.这禁止引入未指明的行为; 这是编译器隐式转换参数时通常会发生的行为.
在源代码中QCOMPARE看起来像
#define QCOMPARE(actual, expected) \
do {\
if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
return;\
} while (0)
template <typename T>
inline bool qCompare(T const &t1, T const &t2, const char *actual, const char *expected,
const char *file, int line)
{
return compare_helper(t1 == t2, "Compared values are not the same",
toString(t1), toString(t2), actual, expected, file, line);
}
Run Code Online (Sandbox Code Playgroud)
它是一个模板,要求第一个和第二个参数属于同一类型.