ошибка компоновщика встроенной функции - PullRequest
26 голосов
/ 05 июня 2009

Я пытаюсь использовать встроенные функции-члены определенного класса. Например, объявление и реализация функции без встраивания выглядит так:

в заголовочном файле:

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. 

Что должно быть для того, чтобы избавиться от этой ошибки (т. Е. Что я делаю неправильно с точки зрения выполнения этих встроенных функций-членов)?

Ответы [ 5 ]

28 голосов
/ 05 июня 2009

Затем вам нужно поместить определение функции в заголовок. Простейший способ подсказки компилятору о встроенном - это включить тело метода в объявление класса, например:


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

или, если вы настаиваете на отдельном заявлении и определении:


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

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

Определение должно быть видно в каждой единице перевода, которая использует этот метод.

24 голосов
/ 05 июня 2009

из C ++ FAQ Lite

Если вы поставите встроенную функцию определение в файл .cpp, и если это вызывается из другого файла .cpp, вы получите «неразрешенный внешний» ошибка компоновщика.

Как вы скажете компилятору сделать функцию-член встроенной?

5 голосов
/ 05 июня 2009

Как уже отмечали другие, вам нужно переместить определение встроенной функции в файл заголовка, например так:

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

Причина этого в том, что компилятор должен знать, какой код встроить, когда он видит вызов встроенной функции. Если вы оставите определение функции в файле .cpp для класса NeedleUSsim, код, сгенерированный для него компилятором, будет захвачен в объектном файле NeedleUSsim. Поскольку компилятор читает только исходный код & mdash; он никогда не заглядывает в объектный файл другого класса & mdash; он просто не может узнать, каким кодом заменить вызов при компиляции другого файла .cpp.

3 голосов
/ 05 июня 2009

Если у вас есть встроенная функция, вы должны поместить определение в заголовочный файл.

0 голосов
/ 05 июня 2009

См. Идиому Inline Guard Macro . Это, по крайней мере, позволит вам хоть немного отделить код от декларации. Он также позволяет переключать функции с помощью define.

...