Подтвердить что ты не робот

Ошибка компоновщика встроенной функции

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

в файле заголовка:

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)" ([email protected]@@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. 

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

4b9b3361

Ответ 1

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


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

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


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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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