0

chars をカスタム type にマップする静的 std::map メンバー変数を持つクラスがありますTerrain。このマップをクラスの実装ファイルに入力しようとしていますが、いくつかのエラーが発生します。これが私のヘッダーファイルです:

#ifndef LEVEL_HPP
#define LEVEL_HPP

#include <bitset>
#include <list>
#include <map>
#include <string>
#include <vector>
#include "libtcod.hpp"

namespace yarl
{
    namespace level
    {
        class Terrain
        {
        // Member Variables
            private:
               std::bitset<5> flags;

        // Member Functions
            public:
                explicit Terrain(const std::string& flg)
                : flags(flg) {}

            (...)
        };



        class Level
        {
            private:
                static std::map<char, Terrain> terrainTypes;

            (...)
        };
    }
}

#endif 

ここに私の実装ファイルがあります:

#include <bitset>
#include <list>
#include <map>
#include <string>
#include <vector>
#include "Level.hpp"
#include "libtcod.hpp"
using namespace std;

namespace yarl
{
    namespace level
    {
        /* fill Level::terrainTypes */
        map<char,Terrain> Level::terrainTypes['.'] = Terrain("00001");  // clear
        map<char,Terrain> Level::terrainTypes[','] = Terrain("00001");  // clear 
        map<char,Terrain> Level::terrainTypes['\''] = Terrain("00001"); // clear
        map<char,Terrain> Level::terrainTypes['`'] = Terrain("00001");  // clear
        map<char,Terrain> Level::terrainTypes[178] = Terrain("11111");  // wall

        (...)
    }
}

g++ を使用していますが、エラーは次のとおりです。

src/Level.cpp:15: エラー: 競合する宣言 'std::map, std::allocator > > yarl::level::Level::terrainTypes [46]'<br> src/Level.hpp:104: エラー: 'yarl::level::Level::terrainTypes' には、'std::map, std::allocator > > yarl::level::Level::terrainTypes'<br> src/Level.cpp: としての以前の宣言があります。 15: エラー: クラス外の 'std::map, std::allocator > > yarl::level::Level::terrainTypes' の宣言は定義ではありません
src/Level.cpp:15: エラー: 'yarl からの変換: :level::Terrain' から非スカラー型 'std::map, std::allocator > >' が
src/Level.cpp:15 を要求しました: エラー: 'yarl::level::Level::terrainTypes' を初期化できません宣言時に非定数式によって

実装ファイルのマップ割り当て行ごとにこれらのセットを取得します。誰かが私が間違っていることを見ていますか? ご協力いただきありがとうございます。

4

1 に答える 1

1

関数の外で静的メンバーを初期化できますが、任意の操作を実行することはできません。

関数を使用してメンバーを初期化できます。

namespace {
    std::map<char, Terrain> initTerrainTypes() {
        std::map<char, Terrain> m;
        m['.'] = Terrain("00001"); 
        // ...
        return m;
    }
}

map<char,Terrain> Level::terrainTypes = initTerrainTypes();

または、 Boost.Assignのような初期化ユーティリティを使用することもできます:

map<char,Terrain> Level::terrainTypes = boost::assign::map_list_of
   ('.', Terrain("00001"))
   // ...
   (178, Terrain("11111"));
于 2010-05-28T20:37:18.510 に答える