C ++ позволяет статическим членам константы быть определенными внутри класса
blockquote>Нет, 3.1 §2 говорит:
Объявление - это определение если он не объявляет функцию без указания тела функции (8.4), он содержит спецификатор extern (7.1.1) или спецификацию привязки (7.5), а также ни инициализатор, ни функция, он объявляет статический член данных в определении класса (9.4), это объявление имени класса (9.1), это непрозрачная-enum-декларация (7.2), или это объявление typedef (7.1.3), использование-декларация (7.3.3) или using-директива (7.3.4).
blockquote>
Во-первых, не храните сами объекты на карте, сохраняйте указатели на свои объекты.
Во-вторых, вам нужно передать экземпляр Scene_Branding в std :: make_pair, а не сам класс.
РЕДАКТИРОВАТЬ: Вот как вы собираетесь хранить указатели:
string CurrentScene = "Scene_Branding";
map<string, Scene*> Scenes;
Scenes.insert(std::make_pair("Scene_Branding", new Scene_Branding()));
Но, поскольку вы задали этот тип вопросов, я рекомендую вам прочитать хорошую книгу по C ++ для дальнейшего понимания таких понятий, как указатели.
Попробуйте:
Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding()));
Я думаю, вы не хотите этого делать.
boost :: ptr_map
, если хотите. Итак, «новый» код:
class Scene
{
public:
virtual ~Scene(); // Virtual Destructor, it's a base class
virtual Scene* clone() const = 0; // Polymorphic construction
private:
// whatever you wish
};
class Scene_Branding: public Scene
{
public:
virtual Scene_Branding* clone() const { return new Scene_Branding(); }
};
И новый способ их хранения :
const std::string SceneBrandingKey = "Scene_Branding";
typedef boost::ptr_map<std::string, Scene> scenes_type;
scenes_type Scenes;
Scenes.insert(SceneBrandingKey, new Scene_Branding());
И вы можете использовать его таким образом:
Scenes["Scene_Branding"].process(); // Note: use '.' not '->'
Хорошая особенность Контейнера указателя повышения заключается в том, что он предназначен для полиморфных типов, с безопасностью исключений и всем остальным, и все же имитирует поведение / интерфейс STL, чтобы вы не заблудились :)