C++ 压制;基类&x2018;X类’;应在复制构造函数中显式初始化;来自模板类的库标头

C++ 压制;基类&x2018;X类’;应在复制构造函数中显式初始化;来自模板类的库标头,c++,templates,gcc,compilation,C++,Templates,Gcc,Compilation,我有一个类似的问题 我正在使用第三方库。它在文件headers/things.h中定义了如下类(由于许可问题伪造了所有名称): class A { public: virtual ~A() {} }; template < class T, class U > class B : virtual public A { public: B(T) {} B(const B< T,U >) {} virtual ~B() {} };

我有一个类似的问题

我正在使用第三方库。它在文件
headers/things.h
中定义了如下类(由于许可问题伪造了所有名称):

class A {
public:
    virtual ~A() {}
};


template < class T, class U >
class B : virtual public A {
public:
    B(T) {}

    B(const B< T,U >) {}

    virtual ~B() {}
};


template < class T, class U >
class  C : virtual public B< T, U > {
public:
    C(T t) : B < T, U > (t) {}

    C(const C< T,U > &other) : B< T,U >(other) {}

    ~C() {}
};
文件布局为:

../
|-- source
|   `-- things.cpp
`-- headers
    `-- things.h
我知道这个警告意味着什么,我不是这样要求的。 由于它位于第三方库中,出于维护原因,我非常不愿意修改(修复)它。我只是想忽略这个警告

我正在使用以下工具编译代码:

g++ things.cpp -o things -Wall -Wextra -Werror -isystem ../headers/
我使用
-isystem
指定目录,因为gcc文档声明:

GCC处理系统标头时,除由#warning(参见诊断)生成的警告外,所有警告都被抑制。 (...) -isystem命令行选项将其参数添加到目录列表中以搜索标题,就像-I一样。在该目录中找到的任何标题都将被视为系统标题

这似乎在一般情况下起作用,因为几乎所有来自第三方库的警告都被抑制了

不幸的是,由于该声明恰好是
typedef
'd模板类的实例化,编译器认为它正在编译的是我的代码,而不是(伪)系统头

如参考问题中所述,不可能仅抑制此警告,而我必须禁用
-Wextra
,这是我不想做的

问题:是否有可能抑制此警告?为了让gcc意识到这不是我的代码,而是库代码


我使用GCC 4.1.2,

< P>正如其他人提到的,使用一个新的编译器似乎是一个比下面更好的方法,但是当你的手似乎被束缚时,考虑下面的方法:

围绕第三方库类创建包装类

class MyCC {
    CC cc;
};

template<typename T, typename U>
class MyB {
    B<T, U> b;
};

希望pragma将在唯一直接使用库的客户端中抑制警告,而所有其他代码都可以使用包装器,因此不需要pragma。

gcc-4.1.2已经有8年历史了,您必须使用这个版本吗?我用gcc-4.6、gcc-4.8、gcc-4.9和clang++-3.4尝试了您的代码示例,但没有一个出现此警告。您发布的代码产生了很多错误,但没有您提到的警告。请构建一个显示问题的MCVE。不幸的是,是的-库的提供者(以及一般的框架)声明这是唯一官方支持的用于Linux的gcc版本。方言也是一样,我们使用
gnu++98
@Wintermute我已经编辑了这个问题,现在请看一看。如果更正标题会发生什么?那么整件事都编译/链接了吗?我正在尝试实现你提出的解决方案。请看这里:,这是你的意思吗?因此,#pragma似乎没有帮助,我仍然收到警告:
。/headers/things.hpp:在复制构造函数'C::C(const C&)[with t=int,U=int]:../headers/x.hpp:28:从这里实例化
我的意思是将pragma放在include things.hpp之前。你能检查一下这是否解决了问题吗?@Matthiias Vegh,我已经检查过了,但也没有效果。
../
|-- source
|   `-- things.cpp
`-- headers
    `-- things.h
g++ things.cpp -o things -Wall -Wextra -Werror -isystem ../headers/
class MyCC {
    CC cc;
};

template<typename T, typename U>
class MyB {
    B<T, U> b;
};
#pragma GCC system_header