簡體   English   中英

從cpp文件內聯函數時出現鏈接器錯誤

[英]Linker error when inlining function from cpp file

那么在執行以下操作時,我得到一個鏈接器(無法解析的外部符號)錯誤:

-我有一個“對象”類-在“ object.h”中定義。

它具有如下構造函數: explicit Object(double x, /* lots more */);

在文件“ object.cpp”中,我想給該構造函數一個主體: Object::object(double x) : _x(x) {}

這行得通。但是,如果我在“ object.cpp”文件中添加關鍵字“ inline”:

inline Object::Object(double x) : _x(x) {}

突然出現鏈接器錯誤! “錯誤LNK2019:無法解析的外部符號”

為什么? -這意味着我不能在構造函數中使用內聯嗎?

編輯:實際上,我注意到所有方法都是如此。 但是,如果我將所有方法都移到object.h標頭fil中,它將起作用。 您不能從定義對象的頭文件外部內聯函數嗎?

EDIT2:好的大更新,我決定建立一個快速的測試案例:
main.cpp

#include "a.h"
int main ()
{
    a t;
    t.test(5);
    return 0;
}

class a {
public:
    void test (int x);
};

cpp文件

#include <iostream>
#include "a.h"
inline void a::test(int x) {
    std::cout << x << std::endl;
}

這給出了以下錯誤:

main.obj:錯誤LNK2019:函數_main中引用的未解析的外部符號“ public:void __thiscall a :: test(int)”(?test @ a @@ QAEXH @ Z)

刪除“ inline”關鍵字可使程序正常工作。將“ ah”和“ a.cpp”合並為1個文件也是如此。

我真的想不出更多的信息:/

您需要了解有關標記為inline函數的定義的規則。

inline標記函數意味着您可以在程序中的多個翻譯單元中定義函數(但每個翻譯單元只能定義一次),但所有定義必須相同,並且必須在其中包含該函數的每個翻譯單元中提供一個定義用過的。

在您的示例中,來自main.cpp的翻譯單元使用a::test(int) main.cpp a::test(int)但是該翻譯單元中沒有定義。 a.cpp的翻譯單元中有一個定義,但在此處已標記為inline ,這意味着您不能在main.cpp的翻譯單元中保留定義。

我不確定為什么要a.cpp inlinea.cpp的定義,因為它不是必需的或無用的。 inline允許您將函數定義放在共享頭文件中,但是如果要將函數放在源文件中則沒有用。

無論代碼是否內聯,代碼中的構造函數名稱中都帶有小寫的o C ++名稱區分大小寫。

嘗試這個:

inline Object::Object(double x) : _x(x) {}

我不清楚您發布的代碼中的/* lots more */注釋是什么意思。 如果此聲明中還有其他參數,則構造函數的定義必須與之匹配。

在執行中有些不一致的地方。 如果此代碼是在類定義中編寫的,則不需要“ Object ::”。 有時這可能會導致編譯器錯誤。 只需擦除它,然后重試。 如果寫出了類定義,則不能在此聲明內聯。

暫無
暫無

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

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