Ответ 1
Тело встроенной функции должно находиться в заголовке, чтобы компилятор мог фактически заменить его там, где это необходимо. См. Так: Как вы сообщаете компилятору о создании функции-члена в строке?
Я получаю ошибку компилятора, когда пытаюсь встроить метод одного из моих классов. Он работает, когда я забираю ключевое слово "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()'
Все в порядке, если я заберу "встроенный". Что вызывает эту проблему? (и как я должен встроить методы класса? Возможно ли это?)
Спасибо.
Тело встроенной функции должно находиться в заголовке, чтобы компилятор мог фактически заменить его там, где это необходимо. См. Так: Как вы сообщаете компилятору о создании функции-члена в строке?
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() {}
Вы определили его как нестрочный в файле заголовка, а в файле cpp, который вы пытаетесь определить как встроенный. Это противоречивое определение, и оно не сможет найти одно от другого. В вашем заголовке размещено ключевое слово inline.
Однако я бы удалил ключевое слово inline, так как это действительно больше предложений для компилятора. Вам действительно нужно только это, когда в заголовке есть свободно плавающая функция, и вы не хотите, чтобы в вашей базе кода появилось несколько определений.