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