2010-05-28 9 views
0

J'ai une classe avec une variable membre statique std :: map qui mappe char s à un type personnalisé Terrain. J'essaie de remplir cette carte dans le fichier d'implémentation de la classe, mais j'ai plusieurs erreurs. Voici mon fichier d'en-tête:déclaration conflictuelle lors du remplissage d'une variable std :: map de membre de classe statique

#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 

et voici mon dossier de mise en œuvre:

#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 

     (...) 
    } 
} 

J'utilise g ++, et les erreurs que je reçois sont

src/Level.cpp: 15: erreur : déclaration contradictoire 'std :: map, std :: allocateur>> yarl :: niveau :: Level :: terrainTypes [46]'
src/Level.hpp: 104: erreur: 'yarl :: niveau :: Niveau: : Les 'terrains' ont une déclaration précédente 'std :: map, std :: allocateur>> yarl :: niveau :: Level :: terrainTypes'
src/Level.cpp: 15: erreur: déclaration de 'std :: map, std :: allocateur>> yarl :: niveau :: Level :: terrainTypes' en dehors de la classe n'est pas la définition
src/Level.cpp : 15: erreur: conversion de 'yarl :: level :: Terrain' en type non-scalaire 'std :: map, std :: allocateur>>' demandé
src/Level.cpp: 15: erreur: 'yarl: : level :: Level :: terrainTypes 'ne peut pas être initialisé par une expression non-constante lors de sa déclaration

Je reçois un ensemble de ces éléments pour chaque ligne d'affectation de mappage dans le fichier d'implémentation. Quelqu'un voit ce que je fais mal? Merci de votre aide.

Répondre

1

Vous pouvez initialiser membres statiques en dehors des fonctions, mais vous ne pouvez pas effectuer d'opérations arbitraires.

Vous pouvez utiliser une fonction pour initialiser les membres:

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

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

Ou vous pouvez utiliser des utilitaires d'initialisation comme Boost.Assign:

map<char,Terrain> Level::terrainTypes = boost::assign::map_list_of 
    ('.', Terrain("00001")) 
    // ... 
    (178, Terrain("11111")); 
+0

La première option a résolu le problème. Merci de votre aide. – Max