【问题标题】:g++ warnings, inline virtual function used but not definedg++ 警告,使用内联虚函数但未定义
【发布时间】:2014-08-29 09:57:33
【问题描述】:

我目前遇到了 警告问题,我无法摆脱。我的代码运行良好,但此警告不断弹出:

ChildModel.h:136:24:警告:内联函数 virtual int ChildModel::getLinkCost(const Link&) const 已使用但从未定义 [默认启用]

我目前在 S.O 上找到了 this post,也有同样的问题,但答案是特定于库(定义某些东西),所以它对我不起作用。

我的代码如下:

class Model {
public:
    virtual inline int getLinkCost(Link const& link) const;
};

class ChildModel: public Model {
public:
    /** Warning on the line bellow: **/
    virtual inline int getLinkCost(Link const& link) const;
};

ChildModel重新定义的函数只有Model::getLinkCost,而Model::getLinkCost方法只被Model的方法调用。所有方法都定义在一个 C++ 文件Model.cpp

【问题讨论】:

  • 如果是inline,如何链接到定义?
  • inline 这里没有效果。关于警告:它告诉您该函数定义。所以告诉我们你的Model.cpp(以及你如何编译/链接你的代码)。
  • "所有方法都定义在一个 C++ 文件Model.cpp。" - 那么它不应该是内联的。必须在每个使用它们的源文件中定义内联函数;所以要么删除inline 说明符,要么在标题中定义它。
  • 内联虚函数很难被编译器内联。一般来说,我不会打扰他们。
  • @MikeSeymour 好的,所以我理解我的错误。但是为什么即使有这个警告它也能正常工作呢? @NeilKir 既然你这么说,我意识到我的inline 在这种情况下是无用的......

标签: g++ c++ g++


【解决方案1】:

来自http://en.cppreference.com/w/cpp/language/inline

内联函数的定义必须存在于调用它的翻译单元中。

如果要在 .cpp 文件中定义函数,则必须从 .h 文件中删除 inline 说明符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多