如何消除"gcc版本4.8.2中使用匿名命名空间的类型[-Werror]"的警告信息

6
在我的项目的头文件中,以下行被包含在一个内联方法中。
typedef boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<      boost::archive::iterators::remove_whitespace<std::string::const_iterator>>, 8, 6> Base64ToBin;

当我使用gcc 4.8.2编译时,出现以下错误:
错误:'boost :: archive :: iterators :: remove_whitespace <__gnu_cxx :: __normal_iterator> >'具有一个字段'boost :: archive :: iterators :: remove_whitespace <__gnu_cxx :: __normal_iterator> > ::',其类型使用匿名名称空间[-Werror]
我努力解决这个问题,但没有成功。从 link1 link2中看来,这似乎是gcc低版本的问题。请问有人能建议如何消除此警告或解决该问题吗?我正在使用-Werror标志进行编译。
1个回答

13

这看起来像是一个正确的警告。因为代码在头文件中,它将从多个文件中包含,但匿名命名空间对于每个文件都是唯一的。这意味着该类型在各处的定义并不相同。

解决方案:将相关代码移动到 .cpp 文件中。


2
你能解释一下在这个typedef上下文中什么是匿名吗?我真的弄不明白。那将对我非常有帮助。 - Panch
1
这是全局头文件,我不能将其移动到源文件中。是否有一种方法可以完全禁用所有警告消息,尽管使用了 -Wall -Werror 进行编译。我尝试过 #pragma GCC disagnostic ignored "-Wall",但是 #pragma GCC disagnostic ignored "-Werror" 也没有帮助。 - Panch
@Panch:-Wall-Werror不是特定的警告,但#pragma GCC diagnostic warning -Wxyz会禁用特定的警告xyz。我认为这是-Wsubobject-linkage - MSalters
你是对的。它是-Wsubobject-linkage,但不幸的是,编译器gcc 4.8.2无法识别它。也许应该在更高版本中可用。如果我错了,请有人纠正我。 - Panch
3
我建议你更加小心,不要仅仅试图压制这个警告,它是真实存在的 - 只有编译器无法确定是否存在实际危险。链接器确实将匿名对象视为每次使用时的不同实体,这可能是一个潜在的危险,一旦这样的类型与静态数据一起在多个编译单元上共享,尤其是在初始化时。我曾经因为类似的情况受到过很大的伤害... - Ichthyo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接