sta*_*tor 28 c++ inline linker-errors
我正在尝试使用特定类的内联成员函数.例如,没有内联的函数声明和实现是这样的:
在头文件中:
int GetTplLSize();
Run Code Online (Sandbox Code Playgroud)
在.cpp文件中:
int NeedleUSsim::GetTplLSize()
{
return sampleDim[1];
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,如果我将"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.
为了摆脱这个错误需要做什么(即在制作这些内联成员函数方面我做错了什么)?
Nik*_*sov 30
您需要将函数定义放入标题中.提示编译器内联的最简单方法是在类声明中包含方法体,如:
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
Run Code Online (Sandbox Code Playgroud)
或者,如果你坚持单独的声明和定义:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
Run Code Online (Sandbox Code Playgroud)
必须在使用该方法的每个翻译单元中显示该定义.
you*_*ung 25
来自C++ FAQ Lite
如果将内联函数的定义放入.cpp文件中,并且从其他.cpp文件调用它,则会从链接器中获得"未解析的外部"错误.
小智 5
正如其他人已经指出的那样,您需要将内联函数的定义移动到头文件中,如下所示:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
Run Code Online (Sandbox Code Playgroud)
原因是编译器在看到对内联函数的调用时需要知道要内联哪些代码。如果将函数的定义保留在NeedleUSsim类的.cpp文件中,则编译器为其生成的代码将被捕获在NeedleUSsim对象文件中。由于编译器仅读取源代码(它不会窥视另一个类的目标文件),因此在编译另一个.cpp文件时,它根本无法知道用什么代码替换调用。