5

好吧,我在执行以下操作时遇到了链接器(未解析的外部符号)错误:

-我有一个类“对象” - 它在“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标头文件中,它确实可以工作。您不能从定义对象的头文件外部内联函数吗?

EDIT2:好吧,一个大更新,我决定构建一个快速测试用例:
main.cpp

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

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”关键字使程序工作。将“ah”和“a.cpp”组合到1个文件中也是如此。

我真的想不出更多信息可以提供:/

4

3 回答 3

4

您需要了解有关标记为 的函数的定义规则inline

标记函数inline意味着您可以在程序中的多个翻译单元中定义该函数(但每个翻译单元只能定义一次),但所有定义必须相同,并且您必须在使用该函数的每个翻译单元中提供定义.

在您的示例中,翻译单元main.cpp使用a::test(int)但该翻译单元中没有定义。翻译单元中有一个定义,a.cpp但此处已标记inline,这意味着您不能将定义从main.cpp.

我不确定您为什么要添加inline到定义中,a.cpp因为它没有必要或有用。inline允许您将函数定义放在共享头文件中,但如果您想将函数放在源文件中,它就没有用。

于 2010-11-19T00:11:07.873 回答
2

o无论是否内联,代码中的构造函数名称都有一个小写字母。C++ 名称区分大小写。

试试这个:

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

我不清楚/* lots more */您发布的代码中的评论是什么意思。如果您在此声明中有其他参数,则构造函数的定义必须与之匹配。

于 2010-11-18T23:23:18.790 回答
0

执行中有一些不一致的地方。如果此代码是在类定义中编写的,则不需要“Object::”。有时这可能会导致编译器错误。只需擦除它并重试。如果是写出类定义,你不能在这里声明内联。

于 2010-11-18T23:45:52.280 回答