1

我有一个枚举 StackIndex 定义如下:

typedef enum 
{
    DECK,
    HAND,
    CASCADE1,
    ...
    NO_SUCH_STACK
} StackIndex;

我创建了一个名为 的类MoveSequence,它是一std::deque组元组形式的包装器<StackIndex, StackIndex>

class MoveSequence
{
    public:
        void AddMove( const tpl_move & move ){ _m_deque.push_back( move ); }
        void Print();
    protected:
    deque<tpl_move> _m_deque;
};

我想我可以创建一个类的静态std::map成员MoveSequence,它将 a 转换StackIndex为 a std::string,供Print()函数使用。但是当我尝试时,我得到了错误:

"error C2864: 'MoveSequence::m' : only static const integral data members can be initialized within a class"

如果无法将 std::map 创建为静态成员,是否有另一种方法可以创建将 a 转换为可用于打印出对象的 a 的 std StackIndex:: std::stringmap MoveSequence

谢谢

比带。

4

4 回答 4

6

您需要将初始化移动到源文件中:

// header
struct foo
{
    typedef std::map<unsigned, std::string> the_map;
    static const the_map m;
};

// source
const foo::the_map foo::m(...);

但是,您要对其进行初始化。C++0x 消除了这个限制。

请记住Boost.Assign使这非常容易:

#include <boost/assign.hpp>
const foo::the_map foo::m = boost::assign::map_list_of(1, "a")(2, "b");
于 2010-01-11T22:29:18.077 回答
4

您可以使 std::map 成为该类的静态成员。你不能做的是在类定义中初始化它。请注意,这是错误告诉您的内容:

错误 C2864: 'MoveSequence::m' : 只有静态 const 整数数据成员可以在一个类中*初始化*

所以,你想在标题中有这个:

class MoveSequence
{
    static std::map<StackIndex, std::string> _m_whatever;
};

然后在你想要的源(.cpp)文件中:

std::map<StackIndex, std::string> MoveSequence::_m_whatever( ..constructor args.. );
于 2010-01-11T22:29:38.830 回答
2

我不认为你想要一个 std::map (尽管这里的所有其他答案都是关于如何做到这一点的好答案)。听起来您只需要一个静态 C 字符串数组,其中索引是枚举值。

const char* const stacknames[] = 
{
    "deck",
    "hand",
    "cascade1"
};

然后 stacknames[DECK] 是“deck”,等等。

于 2010-01-11T22:58:32.183 回答
1

正如其他人所建议的,您需要在 C++ 源文件中创建地图的静态实例。在初始化它时,我建议在 MoveSequence 中创建一个静态函数:

class MoveSequence {

   static void InitMap() {
      if ( m_map.size() == 0 ) {
           m_map.insert( std::make_pair( DECK, "deck" ) );
            m_map.insert( std::make_pair( HAND, "hand" ) );
      }
   }
   ...
};

然后,您可以从 MoveSequence 的构造函数中调用它。

哦,顺便说一句,枚举上不需要 typedef:

enum StackIndex {
  ...
};
于 2010-01-11T22:41:54.777 回答