为什么QCOMPARE(QString(" 1")," 1")导致链接器错误?

时间:2015-03-17 14:51:15

标签: 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)

示例代码:

QVERIFY(QString("1") == "1");         // This works.
QCOMPARE(QString("1"), QString("1")); // This works.
// QCOMPARE(QString("1"), "1");       // Causes a linker error!

为什么? QCOMPARE不使用2个术语的相等运算符吗?

编辑:自评论中询问后,该项目由Qt Creator的单元测试向导创建(文件 - >新项目 - &gt;其他项目 - &gt; Qt单元测试),所以当然它已经正确设置,并且包括QT += testlib

1 个答案:

答案 0 :(得分:10)

来自Qt documentation

  

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);
}

这是一个模板,要求第一个和第二个参数属于同一类型。