Ошибка компоновщика встроенной функции
Я пытаюсь использовать встроенные функции-члены определенного класса. Например, объявление функции и ее реализация без встраивания таковы:
в файле заголовка:
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.
Что должно быть, чтобы избавиться от этой ошибки (то есть, что я делаю неправильно с точки зрения создания этих встроенных функций-членов)?
Ответы
Ответ 1
Затем вам нужно поместить определение функции в заголовок. Самый простой способ намекнуть компилятору на inline - включить тело метода в объявление класса, например:
class NeedleUSsim
{
// ...
int GetTplLSize() const { return sampleDim[1]; }
// ...
};
или, если вы настаиваете на отдельном объявлении и определении:
class NeedleUSsim
{
// ...
int GetTplLSize() const;
// ...
};
inline int NeedleUSsim::GetTplLSize() const
{ return sampleDim[1]; }
Определение должно быть видимым в каждой единицы перевода, которая использует этот метод.
Ответ 2
из С++ FAQ Lite
Если вы ввели встроенную функцию в файл .cpp, и если это вызывается из другого файла .cpp, вы получите "нерешенный внешний", ошибка от компоновщика.
Как вы сообщаете компилятору о создании функции-члена в строке?
Ответ 3
Если у вас встроенная функция, вы должны поместить определение в файл заголовка.
Ответ 4
Как уже указывалось другими, вам нужно переместить определение встроенной функции в заголовочный файл, например:
class NeedleUSsim
{
// ...
inline int GetTplLSize() { return sampleDim[1]; }
// ...
};
Причиной этого является то, что компилятор должен знать, какой код встроен, когда он видит вызов встроенной функции. Если вы оставите определение функции в файле .cpp для класса NeedleUSsim, код, созданный для него компилятором, попадает в ловушку в объектном файле NeedleUSsim. Поскольку компилятор только считывает исходный код &mdash, он никогда не заглядывает в другой объект файл объекта — он просто не знает, с каким кодом заменить вызов при компиляции другого .cpp файла.
Ответ 5
Смотрите Inline Guard Macro idiom. Это, по крайней мере, позволит вам отделить, хотя и немного, код от декларации. Он также позволяет переключать встраивание функций с помощью define
.