C++ 内联函数链接器错误

C++ 内联函数链接器错误,c++,inline,linker-errors,C++,Inline,Linker Errors,我试图使用特定类的内联成员函数。例如,没有内联的函数声明和实现如下: 在头文件中: int GetTplLSize(); 在.cpp文件中: int NeedleUSsim::GetTplLSize() { return sampleDim[1]; } 出于某种原因,如果我将“inline”关键字放在实现和声明中的任何一个位置,以及两个位置,就会出现链接器错误,如图所示: Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_H

我试图使用特定类的内联成员函数。例如,没有内联的函数声明和实现如下:

在头文件中:

int GetTplLSize();
在.cpp文件中:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}
出于某种原因,如果我将“inline”关键字放在实现和声明中的任何一个位置,以及两个位置,就会出现链接器错误,如图所示:

Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed. 正在创建库C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX\u HN~1\templab.x和对象C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX\u HN~1\templab.exp mexfunction.obj:错误LNK2019:未解析的外部符号“public:int\u thiscall NeedleUSsim::GetTplLSize(void)”(?GetTplLSize@NeedleUSsim@@QAEHXZ)在函数_mexFunction中引用 mexfunction.mexw32:致命错误LNK1120:1未解析的外部 C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL:错误:“mexfunction.mexw32”的链接失败。
要消除此错误,需要做什么(即,在生成这些内联成员函数方面我做错了什么)?

如果您有内联函数,则应将定义放入头文件。

然后需要将函数定义放入头文件。提示编译器内联的最简单方法是在类声明中包含方法体,如下所示:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const { return sampleDim[1]; }
  // ...
};
或者,如果您坚持单独声明和定义:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const;
  // ...
};

inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }

在使用该方法的每个翻译单元中必须有定义。C++中的< /P> < P> > FAQ Lite

如果将内联函数的 定义到.cpp文件中,如果 从另一个.cpp文件调用, 您将得到一个“未解决的外部问题” 链接器出错


正如其他人已经指出的,您需要将内联函数的定义移动到头文件中,如下所示:

class NeedleUSsim
{
  // ...
  inline int GetTplLSize() { return sampleDim[1]; }
  // ...
};

这样做的原因是,当编译器看到对内联函数的调用时,需要知道要内联哪些代码。如果将函数的定义保留在.cpp文件中,则编译器为其生成的代码将被捕获在NeedleUSsim对象文件中。由于编译器只读取源代码,它从不窥视另一个类的对象文件,因此在编译另一个.cpp文件时,它根本无法知道用什么代码替换调用

请参阅。这至少允许您将代码从声明中分离出来,尽管分离程度很小。它还允许您通过
define

切换函数的内联。我尝试将内联关键字放在头文件中的定义上,但仍然得到相同的链接器错误。不只是内联关键字,整个定义都应该放在头文件中。那么,将它从.cpp文件移到.h文件中。这是唯一的方法吗?(出于可读性原因,我想将声明和实现分开)基本上是的。编译器在编译对函数的调用时必须知道函数体,因此函数体必须位于包含的头文件中。但是,您仍然可以在类声明中声明函数,并在稍后的头文件中添加实现。我想我只能接受这样写代码了。谢谢你的建议。有些人喜欢将内联函数放在一个单独的头文件中,并将其包含在主头文件(末尾)中,而不是将它们放在主头文件中。我个人并不100%相信这一点(对我来说这是浪费时间),但如果你喜欢,这是另一种选择。是的,我不想提及这一点。在《可怜的技术》中:)不幸的是,正如我刚刚发现的那样,MSVC 2013年和2015年的情况并非如此。我在一个CPP文件(在一个库中)中有一个内联,它的代码是从一些完全不同的CPP源代码中调用的,这些源代码有一个同名的内联(但代码稍有不同,因此结果确实破坏了测试)。我认为开发环境中存在bug。很难找到。。。