【问题标题】:Why does QCOMPARE(QString("1"), "1") cause a linker error?为什么 QCOMPARE(QString("1"), "1") 会导致链接器错误?
【发布时间】:2015-05-20 01:42:13
【问题描述】:

我正在探索 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 不是用了两个term的相等运算符吗?

编辑: 既然是在cmets中问的,项目是由Qt Creator的单元测试向导创建的(File->New Project->Other Project->Qt Unit Test),所以理所当然已正确设置,并包含QT += testlib

【问题讨论】:

    标签: c++ qt unit-testing linker-errors


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多