Вопрос

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

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

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top