从cpp文件内联函数时链接器错误

时间:2010-11-18 23:21:45

标签: c++ linker-errors unresolved-external

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

- 我有一个“对象”类 - 它在“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;
}

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 个答案:

答案 0 :(得分:4)

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

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

在您的示例中,main.cpp的翻译单元使用a::test(int),但该翻译单元中没有定义。翻译单元中的定义来自a.cpp,但此处标记为inline,这意味着您无法将翻译单元中的定义从main.cpp中删除。

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

答案 1 :(得分:2)

代码中的构造函数名称中包含小写o,无论是否为内联。 C ++名称区分大小写。

试试这个:

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

我不清楚您发布的代码中的/* lots more */评论的含义。如果你在这个声明中有其他参数,那么构造函数的定义必须与之匹配。

答案 2 :(得分:0)

实施中存在一些不一致的事情。 如果此代码是在类定义中编写的,那么您不需要“Object ::”。有时这可能会导致编译错误。只需擦除它然后再试一次。 如果是从类定义中写出来的,则不能在此声明内联。