C++ Qt创建者“;已使用但从未定义的内联函数”–;为什么?

C++ Qt创建者“;已使用但从未定义的内联函数”–;为什么?,c++,qt,qt-creator,C++,Qt,Qt Creator,为什么我会在Qt Creator中收到这样的警告:'inline function'bool Lion::growl()'已使用但从未定义过 我仔细检查了我的代码,并有一个声明 inlinebool咆哮()在Lion(Lion.h) 以及lion.cpp中相应的实现: inline bool Lion::growl() 发生什么事了 编辑:我的假设是在.cpp文件中定义实际的内联方法是合法的(关键字inline提醒编译器在别处查找方法体),还是我错了 我不想把我的头文件与实现细节混在一起。好吧,

为什么我会在Qt Creator中收到这样的警告:'inline function'bool Lion::growl()'已使用但从未定义过

我仔细检查了我的代码,并有一个声明

inlinebool咆哮()
Lion
Lion.h

以及
lion.cpp
中相应的实现:

inline bool Lion::growl()

发生什么事了

编辑:我的假设是在.cpp文件中定义实际的内联方法是合法的(关键字
inline
提醒编译器在别处查找方法体),还是我错了


我不想把我的头文件与实现细节混在一起。

好吧,我不知道确切的问题,但对于初学者来说:

  • 内联方法应该在头文件中实现。编译器需要知道实际内联的代码
  • 在类声明中使用“inline”关键字也没有任何效果。但这也不会有什么坏处

另请参见:

除了Johan所说的,您不能对函数有单独的定义和声明,即使两者位于同一头文件中。这尤其适用于类的成员函数。功能代码的形式应为:

class someClass
{
void someFunc()
{ ... }
}
// This will make the function inline even w/o the explicit 'inline'
而不是其形式

内联方法应该在头文件中实现。这个 编译器需要知道实际内联的代码

除非内联函数在同一个项目中使用,可能在另一个包含其头的文件中使用

我错过了对库的这样一个限制,因为将头限制为函数原型会使内容更具可读性


把.cpp包括在内怎么样

旁注:据我所知,内联函数是在头文件中实现的(或在头文件底部包含的单独inl文件中)。就我个人而言(这是一个品味问题),我讨厌显式地将代码标记为内联的代码-或者使用内联关键字,或者将实现放在头文件中,原因有二:1)它破坏了封装。2) 这会影响表演-是的,你听到了。你认为谁知道内联一个方法是否能最好地提高性能:编译器还是程序员。严肃地说,人们,相信你的乐观主义者,他们做得比你更好(在很多情况下,但不是全部)。@Thomi如果我只是在函数周围创建一个单行包装,我敢肯定,这是更好的内联。微软是说,他们可以得到一个大的性能提高链接时间和大小减少静态LIBS通过执行这一规则:C++需要“内联函数应定义在每个翻译单位,其中ODR使用。”n3337 basic.def.odr/3这本质上意味着,当内联函数在头中声明时,它也应该在头中定义。实际上,您可以有一个单独的定义和声明:
类C{inline void f();};void C::f(){}
。您只需要使用显式
内联
而不是隐式。
class someClass
{
public:
     void someFunc();
}

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