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

Сложные методы класса С++ вызывают ссылку undefined

Я получаю ошибку компилятора, когда пытаюсь встроить метод одного из моих классов. Он работает, когда я забираю ключевое слово "inline".

Здесь приведен упрощенный пример:

main.cpp:

#include "my_class.h"

int main() {
  MyClass c;
  c.TestMethod();

  return 0;
}

my_class.h:

class MyClass {
 public:
  void TestMethod();
};

my_class.cpp:

#include "my_class.h"

inline void MyClass::TestMethod() {
}

Я пытаюсь выполнить компиляцию с помощью:

g++ main.cpp my_class.cpp

Я получаю сообщение об ошибке:

main.cpp:(.text+0xd): undefined reference to `MyClass::TestMethod()'

Все в порядке, если я заберу "встроенный". Что вызывает эту проблему? (и как я должен встроить методы класса? Возможно ли это?)

Спасибо.

4b9b3361

Ответ 2

7.1.2/4 стандарта:

Встроенная функция должна быть определена в каждая единица перевода, в которой она б...

Вы используете TestMethod в main.cpp, но он не определен там.

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

Вы определяете (и, следовательно, также объявляете) TestMethod inline в my_class.cpp, но не в main.cpp.

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

class MyClass {
 public:
  void TestMethod() {}
};

или вот так:

class MyClass {
 public:
  inline void TestMethod();
};

inline void MyClass::TestMethod() {}

Ответ 3

Вы определили его как нестрочный в файле заголовка, а в файле cpp, который вы пытаетесь определить как встроенный. Это противоречивое определение, и оно не сможет найти одно от другого. В вашем заголовке размещено ключевое слово inline.

Однако я бы удалил ключевое слово inline, так как это действительно больше предложений для компилятора. Вам действительно нужно только это, когда в заголовке есть свободно плавающая функция, и вы не хотите, чтобы в вашей базе кода появилось несколько определений.