簡體   English   中英

為什么QCOMPARE(QString(“1”),“1”)導致鏈接器錯誤?

[英]Why does QCOMPARE(QString(“1”), “1”) cause a linker error?

我正在探索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的單元測試向導(文件 - >新項目 - >其他項目 - > Qt單元測試)創建的,所以當然它已經正確設置,並且QT += testlib包含QT += testlib

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

它是一個模板,要求第一個和第二個參數屬於同一類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM