-1

列挙型の末尾に「COUNT」要素を追加する以外に、列挙型の長さを計算する方法を見つけようとしています。次のようにプリプロセッサを使用する方法を見つけました。

#include <iostream>
#include <boost/preprocessor/tuple/elem.hpp>

//simple declaration
template <class E>
struct enum_size;

//specialization is done in the macro for each enum created
#define MAKE_ENUM(name, ...) enum name {__VA_ARGS__};   \
  template <>                       \
  struct enum_size<name> {                  \
    static const int value = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__);   \
    };

MAKE_ENUM(my_enum1, a, b, c)
//MAKE_ENUM(my_enum2, a) //triggers compilation error

int main(int argc, char** argv) {
  std::cout << enum_size<my_enum1>::value << std::endl;
}

ただし、my_enum2上記のように作成しようとすると、次のようにコンパイラ (CygWin の GCC 4.8.3) から再宣言エラーが発生します。

main.cpp:16:21: error: redeclaration of 'a'
 MAKE_ENUM(my_enum2, a)
                 ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
 #define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \
                                     ^
main.cpp:15:21: note: previous declaration 'my_enum1 a'
 MAKE_ENUM(my_enum1, a, b, c)
                 ^
main.cpp:9:41: note: in definition of macro 'MAKE_ENUM'
 #define MAKE_ENUM(name, ...) enum name {__VA_ARGS__}; \

問題のある行を次のように変更すると、問題MAKE_ENUM(my_enum2, e)なくコンパイルされます。ここで何が間違っているのか、どうすれば修正できるのでしょうか? 前もって感謝します!

4

1 に答える 1

3

変数aにはすでに typemy_enum1があります。再宣言することはできません。これはいくつかの方法で修正できます

1) C++11 を使用している場合はenum class、 の代わりに を使用しenumます。

#define MAKE_ENUM(name, ...) enum class name {__VA_ARGS__};

enum2) に入れるだけnamespaceです。

于 2014-11-11T08:28:49.593 に答える