[英]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
inline
到a.cpp
的定義,因為它不是必需的或無用的。 inline
允許您將函數定義放在共享頭文件中,但是如果要將函數放在源文件中則沒有用。
無論代碼是否內聯,代碼中的構造函數名稱中都帶有小寫的o
。 C ++名稱區分大小寫。
嘗試這個:
inline Object::Object(double x) : _x(x) {}
我不清楚您發布的代碼中的/* lots more */
注釋是什么意思。 如果此聲明中還有其他參數,則構造函數的定義必須與之匹配。
在執行中有些不一致的地方。 如果此代碼是在類定義中編寫的,則不需要“ Object ::”。 有時這可能會導致編譯器錯誤。 只需擦除它,然后重試。 如果寫出了類定義,則不能在此聲明內聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.