【问题标题】: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]

标签: c++ gcc boost compiler-warnings


【解决方案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 的代码作为参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2017-02-02
    • 2013-12-16
    • 2014-02-09
    • 2012-06-14
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多