这是啥意思:“警告:'enum A<B>'和'enum A<B>'之间的比较”?

Posted

技术标签:

【中文标题】这是啥意思:“警告:\'enum A<B>\'和\'enum A<B>\'之间的比较”?【英文标题】:What does this mean: "warning: comparison between 'enum A<B>' and 'enum A<B>'"?这是什么意思:“警告:'enum A<B>'和'enum A<B>'之间的比较”? 【发布时间】:2010-10-23 20:33:21 【问题描述】:

我在 proto.h 的第 42 行添加了以下内容:

typedef boost::make_unsigned<off_t>::type uoff_t;

现在我从 gcc 收到了这个冗长且令人困惑的警告,抱怨将枚举与相同的枚举类型进行比较:

In file included from proto.cpp:12:
/usr/local/include/boost/type_traits/is_unsigned.hpp: In instantiation of 'boost::detail::is_ununsigned_helper<long int>':
/usr/local/include/boost/type_traits/is_unsigned.hpp:73:   instantiated from 'boost::detail::is_unsigned_imp<long int>'
/usr/local/include/boost/type_traits/is_unsigned.hpp:123:   instantiated from 'boost::is_unsigned<long int>'
/usr/local/include/boost/type_traits/make_unsigned.hpp:110:   instantiated from 'boost::detail::make_unsigned_imp<long int>'
/usr/local/include/boost/type_traits/make_unsigned.hpp:130:   instantiated from 'boost::make_unsigned<long int>'
proto.h:42:   instantiated from here
/usr/local/include/boost/type_traits/is_unsigned.hpp:40: warning: comparison between 'enum boost::detail::is_unsigned_values<long int>::<anonymous>' and 'enum boost::detail::is_unsigned_values<long int>::<anonymous>'

谁能破译这个?

【问题讨论】:

您使用的是哪个版本的 Boost? @GMan:也许他没有。这种提升可能是他的环境中预装的。 @WilliamKF:看看/usr/local/include/boost/version.hpp。 GCC 版本也会有所帮助。 @usta Boost 是 v1.43.0 (major.minor.patchLevel) @usta g++ (GCC) 4.2.1 20070719 [FreeBSD] 【参考方案1】:

这就是发生的事情

BOOST_NO_INCLASS_MEMBER_INITIALIZATION 在 Boost.Config 中定义(不知道为什么它会用于 gcc,但我暂时不考虑它)。因此,

BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast<no_cv_t>(-1)));
BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast<no_cv_t>(0)));

boost::detail::is_unsigned_values 中的声明扩展为

enum  minus_one = (static_cast<no_cv_t>(-1)) ;
enum  zero = (static_cast<no_cv_t>(0)) ;

然后这两个未命名但不同枚举的枚举器在boost::detail::is_ununsigned_helper 中进行比较。因此,如果将 BOOST_STATIC_CONSTANT() 扩展为 static const no_cv_t blah blah...,则不会发生警告。

还有两个问题需要回答:

-> 为什么BOOST_NO_INCLASS_MEMBER_INITIALIZATION 在您的案例中被定义?

-> 如果确实定义了该宏,则可以产生这样的警告(比较不同枚举的枚举数)。它在这里是无害的,但在 Boost 中阻止它可能会很好。值得吗?

注意:我使用了 Boost 1.43 的代码作为参考。

【讨论】:

以上是关于这是啥意思:“警告:'enum A<B>'和'enum A<B>'之间的比较”?的主要内容,如果未能解决你的问题,请参考以下文章

这是啥意思? [C#]

这是啥意思?

这是啥意思?

这是 jQuery 相关的,这是啥意思? [复制]

这是啥意思? initWithFrame:CGRectZero]

“getaddrinfo 失败”,这是啥意思?