内联成员函数的C ++链接错误[重复]

Posted

技术标签:

【中文标题】内联成员函数的C ++链接错误[重复]【英文标题】:C++ linkage error for inline member function [duplicate] 【发布时间】:2013-03-01 14:41:44 【问题描述】:

我有以下代码:

IFile.h

class IFile

public:
    IFile();
    ~IFile(void);

    inline bool IsValidFileType() const;
;

IFile.cpp

IFile::IFile()

    //IsValidFileType();


IFile::~IFile(void)



inline bool IFile::IsValidFileType() const

          return true;

main.cpp

int main(int argc, char* argv[])

    IFile* pFile = new IFile();
    pFile->IsValidFileType();

    return 0;

编译代码时出现以下错误: 错误 LNK2019:未解析的外部符号“public: bool __thiscall IFile::IsValidFileType(void)const” (?IsValidFileType@IFile@@QBE_NXZ) 在函数 _main 中引用

如果我更改函数的“内联”或“常量”限定符,或者在构造函数中调用它,程序将编译。 你能解释一下这种行为吗?

【问题讨论】:

要内联它,它需要在调用位置可见。将它放在标题中将是修复它的一种方法 "inline" 不代表"not in line" :-( 请先搜索再询问。这个有很多重复的...... 【参考方案1】:

编译器如何内联一个在编译时看不到代码的函数?编译 main.cpp 时,编译器被要求执行此操作。

【讨论】:

【参考方案2】:

内联函数的代码被编译到每个引用它的翻译单元中(毕竟这是这个想法)。意思是,你需要在头文件中包含代码。

【讨论】:

【参考方案3】:

inline 关键字向编译器承诺,它将能够在使用它的每个翻译单元(*.cpp 文件)中看到定义。你违背了这个承诺,因为 main.cpp 看不到定义,尽管它包含 IFile.h。

通常带有inline 关键字的函数应该定义在头文件中,而不是源文件中。

【讨论】:

谢谢。这是有道理的,但为什么删除 const 也能解决问题呢? 我看不出有任何理由删除 consts 并且什么都不做会在这里有所作为。【参考方案4】:

由于函数是内联的,所以你必须在头文件中定义它,而不是在cpp文件中。

【讨论】:

以上是关于内联成员函数的C ++链接错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 WRL 用于 C++/CX 函数 - 链接器错误 [重复]

c++中的内联函数inline

C++中成员函数的重载覆盖和隐藏的区别

实例成员不能用于类型 - 错误

模板实现顺序表

在 Laravel 5.6 中调用数组上的成员函数 links()