Ошибка компоновщика при встраивании функции из файла cpp - PullRequest
5 голосов
/ 19 ноября 2010

Что ж, я получаю ошибку компоновщика (неразрешенный внешний символ) при выполнении следующих действий:

-У меня есть класс "Object" - он определен в "object.h".

имеет конструктор, подобный: explicit Object(double x, /* lots more */);

в файле "object.cpp" Я хочу дать этому конструктору тело: Object::object(double x) : _x(x) {}

Это работает .. Однако, если я добавлю ключевое слово "inline" в файл "object.cpp":

inline Object::Object(double x) : _x(x) {}

внезапно появляется ошибка компоновщика! «ошибка LNK2019: неразрешенный внешний символ»

Почему? - это значит, что я не могу использовать встраивание с конструкторами?

РЕДАКТИРОВАТЬ: на самом деле я заметил, что это относится ко всем методам. Однако если я переместу все методы в заголовок object.h , он ДЕЙСТВУЕТ. Вы не можете встроить функцию извне файла заголовка, где определен объект?

EDIT2: хорошо, большое обновление, я решил создать быстрый тестовый пример:
main.cpp

#include "a.h"
int main ()
{
    a t;
    t.test(5);
    return 0;
}

хиджры

class a {
public:
    void test (int x);
};

a.cpp

#include <iostream>
#include "a.h"
inline void a::test(int x) {
    std::cout << x << std::endl;
}

Это дает следующую ошибку:

main.obj: ошибка LNK2019: неразрешенный внешний символ «public: void __thiscall a :: test (int)» (? Test @ a @@ QAEXH @ Z), указанный в функции _main

Удаление ключевого слова "inline" заставляет программу работать. Как и при объединении "a.h" и "a.cpp" в 1 файл.

Я действительно не могу придумать больше информации, чтобы дать: /

Ответы [ 3 ]

4 голосов
/ 19 ноября 2010

Вам необходимо понять правила определения функций, отмеченных inline.

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

В вашем примере единица перевода из main.cpp использует a::test(int), но в этой единице перевода нет определения. В единице перевода есть определение из a.cpp, но здесь оно помечено inline, что означает, что вы не можете исключить определение из единицы перевода из main.cpp.

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

2 голосов
/ 19 ноября 2010

У вас есть строчный o в имени конструктора в коде, независимо от того, встроен он или нет.Имена C ++ чувствительны к регистру.

Попробуйте:

inline Object::Object(double x) : _x(x) {}

Мне не ясно, что вы подразумеваете под комментарием /* lots more */ в коде, который вы разместили.если у вас есть другие параметры в этом объявлении, определение конструктора должно соответствовать этому.

0 голосов
/ 19 ноября 2010

В реализации есть что-то несоответствующее.Если этот код написан внутри определения класса, то вам не нужно "Object ::".Иногда это может привести к ошибкам компилятора.Просто удалите его и попробуйте снова.Если записано вне определения класса, вы не можете объявить inline здесь.

...