首页 文章

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

提问于
浏览
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:未解析的外部符号”

为什么? - 这是否意味着我不能使用内联构造函数?

编辑:实际上我注意到所有方法的情况 . 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 回答

  • 4

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

    标记函数 inline 意味着您可以在程序中的多个转换单元中定义函数(但每个转换单元只能放置一次),但所有定义必须相同,并且必须在每个转换单元中提供定义,其中函数是用过的 .

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

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

  • 2

    您在代码中的构造函数名称中有一个小写 o ,无论是否为内联 . C名称区分大小写 .

    试试这个:

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

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

  • 0

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

相关问题