内联成员函数的c++链接错误

C++ linkage error for inline member function

本文关键字:c++ 链接 错误 函数 成员      更新时间:2023-10-16

我有以下代码:

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"或"const"限定符,或者在构造函数中调用它,程序将会编译。你能解释一下这种行为吗?

编译器如何内联一个函数的代码,它不能看到,而它正在编译?当编译main.cpp时,编译器被要求这样做

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

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

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

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