禁用有关在派生类的复制构造函数中显式初始化基础构造函数的警告

时间:2011-01-25 00:11:25

标签: c++ g++ warnings

我正在使用启用了-Wextra的g ++版本4.2.1。我在库中包含了一个标题,我不断收到关于库中类的警告,该类由-Wextra启用(我用BaseClass替换了类的实际名称):

warning: base class ‘class BaseClass’ should be explicitly initialized in the copy constructor

我的问题是:如何禁用此警告?例如,-Wextra也启用-Wuninitialized,但是我可以通过将-Wno-uninitialized作为编译器标志传递来覆盖该简单。关于复制构造函数的警告有什么类似的吗?我无法在g ++联机帮助页或任何其他论坛帖子中找到答案。

3 个答案:

答案 0 :(得分:6)

假设:

class BaseClass
{
public:
    BaseClass();
    BaseClass(const BaseClass&);
};

class DerivedClass : public BaseClass
{
public:
    DerivedClass(const DerivedClass&);
};

此复制构造函数:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // warning: no BaseClass initializer!
{
}

真的意思是:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Default construct the base:
  : BaseClass()
{
}

如果真的是你的意思,你可以输入一个像上面这样的默认构造函数初始化器,警告就会消失。但编译器建议你可能真的想要这个:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Copy construct the base:
  : BaseClass(obj)
{
}

答案 1 :(得分:4)

根据http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(搜索Wextra),这是-Wextra的固有部分,不能单独禁用(例如,它不是单独列出的{{ 1}}选项)。

您可以做的最好的事情是将库的使用隔离到您禁用-W的一个文件或根本不使用-Wextra并单独启用其所有组件(从该链接)。

答案 2 :(得分:3)

如果它不是真正的问题,并且您无法更改库(我猜您不能或您已经这样做了),您可以暂时禁用警告GCC diagnostic pragma