Qt Creator: "встроенная функция используется, но не определена" - почему?

Почему я получаю это предупреждение в Qt Creator: `inline function 'bool Lion:: growl() используется, но не определено?

Я дважды проверил свой код и имел объявление

inline bool growl () в Lion (lion.h)

и соответствующей реализации в lion.cpp:

inline bool Lion::growl ()

Что происходит?

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

Я не хочу загромождать свои файлы заголовков деталями реализации.

Ответы

Ответ 1

Ну, я не знаю точной проблемы, но для начинающих:

  • Предполагается, что встроенные методы будут реализованы в файле заголовка. Компилятор должен знать код, чтобы на самом деле его встроить.
  • Также использование ключевого слова "inline" в объявлении класса не имеет никакого эффекта. Но это тоже не повредит.

Смотрите также: С++ faq lite

Ответ 2

Предполагается, что встроенные методы будут реализованы в файле заголовка. компилятор должен знать код, чтобы фактически вставить его.

За исключением случаев, когда встроенная функция используется в одном проекте, возможно, в другом файле, который # включает заголовок.

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

Как насчет # включения .cpp?

Ответ 3

В дополнение к тому, что сказал Йоханн, у вас не может быть отдельного определения и объявления для функции, даже если оба они находятся в одном заголовочном файле. Это справедливо, особенно для функций-членов классов. Код функции должен иметь вид:

class someClass
{
void someFunc()
{ ... }
}
// This will make the function inline even w/o the explicit 'inline'

И НЕ формы

class someClass
{
public:
     void someFunc();
}

void someClass::someFunc()
{ ... }