32

我正在尝试使用特定类的内联成员函数。例如没有内联的函数声明和实现是这样的:

在头文件中:

int GetTplLSize();

在 .cpp 文件中:

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

出于某种原因,如果我将“inline”关键字放在实现和声明中的任何一个以及两个地方,我都会得到链接器错误,如下所示:

创建库 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x 和对象 C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp
mexfunction.obj:错误 LNK2019:函数 _mexFunction 中引用的未解析外部符号“public:int __thiscall NeedleUSsim::GetTplLSize(void)”(?GetTplLSize@NeedleUSsim@@QAEHXZ)
mexfunction.mexw32:致命错误 LNK1120:1 未解决的外部

  C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL:错误:“mexfunction.mexw32”的链接失败。

为了摆脱这个错误需要做什么(即在制作这些内联成员函数方面我做错了什么)?

4

5 回答 5

35

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


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

或者,如果您坚持单独声明和定义:


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

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

该定义必须在使用该方法的每个翻译单元中可见。

于 2009-06-05T00:13:40.647 回答
26

来自 C++ FAQ Lite

如果将内联函数的定义放入 .cpp 文件中,并且如果从其他 .cpp 文件中调用它,则会从链接器收到“未解析的外部”错误。

你如何告诉编译器使成员函数内联?

于 2009-06-05T00:15:46.850 回答
5

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

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

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

于 2009-06-05T01:00:24.967 回答
3

如果你有一个内联函数,你应该把定义放在头文件中。

于 2009-06-05T00:09:02.557 回答
0

请参阅Inline Guard Macro idiom。这将至少允许您将代码与声明分开,尽管会稍微分开。它还允许您通过define.

于 2009-06-05T02:21:58.827 回答