好吧,我在执行以下操作时遇到链接器(未解析的外部符号)错误:
- 我有一个“对象”类 - 它在“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:未解析的外部符号”
为什么? - 这是否意味着我不能使用内联构造函数?
编辑:实际上我注意到所有方法的情况 . However 如果我将所有方法移动到object.h头文件,它就可以工作了 . 您不能从定义对象的头文件外部内联函数?
EDIT2:好的更新,我决定构建一个快速测试用例:
main.cpp :
#include "a.h"
int main ()
{
a t;
t.test(5);
return 0;
}
a.h
class a {
public:
void test (int x);
};
a.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”关键字使程序工作 . 将“a.h”和“a.cpp”组合成1个文件 .
我真的想不出更多的信息:/
3 回答
您需要了解有关标记为
inline
的函数的定义的规则 .标记函数
inline
意味着您可以在程序中的多个转换单元中定义函数(但每个转换单元只能放置一次),但所有定义必须相同,并且必须在每个转换单元中提供定义,其中函数是用过的 .在您的示例中,
main.cpp
的翻译单元使用a::test(int)
,但该翻译单元中没有定义 . 翻译单元中的定义来自a.cpp
,但此处标记为inline
,这意味着您无法从main.cpp
中删除翻译单元中的定义 .我不确定为什么要将
inline
添加到a.cpp
中的定义,因为它没有必要或有用 .inline
允许您将函数定义放在共享头文件中,但如果要将函数放在源文件中则没有用处 .您在代码中的构造函数名称中有一个小写
o
,无论是否为内联 . C名称区分大小写 .试试这个:
我不清楚您发布的代码中的
/* lots more */
评论是什么意思 . 如果你在这个声明中有其他参数,那么构造函数的定义必须与之匹配 .实施中存在一些不一致的事情 . 如果此代码是在类定义中编写的,那么您不需要“Object ::” . 有时这可能会导致编译错误 . 只需擦除它然后再试一次 . 如果是从类定义中写出来的,则不能在此处声明内联 .