конфликтующее объявление при заполнении статической переменной-члена класса std :: map - PullRequest
0 голосов
/ 29 мая 2010

У меня есть класс со статической переменной-членом std :: map, который сопоставляет char s с пользовательским типом 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]’
src / Level.hpp: 104: ошибка: «yarl :: level :: Level :: terrainTypes» имеет предыдущее объявление как «std :: map, std :: allocator>> yarl :: level :: Level :: terrainTypes»
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» не может быть инициализирован с помощью неконстантного выражения при объявлении

Я получаю набор из них для каждой строки назначения карты в файле реализации. Кто-нибудь видит, что я делаю не так? Спасибо за вашу помощь.

1 Ответ

1 голос
/ 29 мая 2010

Вы можете инициализировать статические члены вне функций, но не можете выполнять произвольные операции.

Вы можете использовать функцию для инициализации членов:

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"));
...