2015-10-04 3 views
0

Редактировать: Просто забыли добавить «state_manager::« Плохо.Частные Typedefs в заголовках?

Я пытаюсь создать простую государственную систему. Чтобы сохранить некоторую типизацию и сделать что-то легче изменить позже, я добавил некоторые typedefs в свой state_manager.hpp. Проблема в том, что эти typedefs, похоже, не распознаются в моем state_manager.cpp. Я получаю ошибки, такие как 'element' does not name a type и странно 'states' was not declared in this scope. Я действительно смущен этим.

state_manager.hpp:

#pragma once 
#include <stack> 
#include <memory> 

class state; 

class state_manager{ 
typedef std::unique_ptr<state> element; 
typedef std::stack<element> container; 
protected: 
container states; 
public: 
void push(const element &to_push); 
void pop(); 
void change(const element &change_to); 
}; 

state_manager.cpp:

#include "state_manager.hpp" 
#include "state.hpp" 

void push(const element &to_push){ 
states.push(to_push); 
} 

void pop(){ 
states.pop(); 
} 

void change(const element &change_to){ 
states.pop(); 
push(change_to); 
} 

ответ

1
void push(const element &to_push){ 
    states.push(to_push); 
} 

- вы не определения функций-членов, но те, не являющихся членами, поэтому вы не иметь доступ к частным членам вашего класса. После этого вы получите ошибку компоновщика. Не забудьте добавить префикс:

void state_manager::push(const element &to_push){ 
    states.push(to_push); 
} 
+1

О, ничего себе! Мне стыдно! Если бы у меня был доллар за каждый раз, когда меня повесили, потому что я забыл приставки. –

2

В дополнении недостающей квалификации как функции-членов, unique_ptr s не копируемые, поэтому текущая реализация push и change не будет работать.

Вы можете изменить их следующим образом:

void state_manager::push(element&& to_push) { 
    states.push(std::forward<element>(to_push)); 
} 

, который затем может быть использован как my_state_manager.push(std::make_unique<state>());

+0

Я внес эти изменения, но сейчас у меня проблема с нетемой. По-видимому make_unique - это C++ 14, но -std = C++ 1y ничего не меняет для меня. Использование gcc 4.8.2. apt-get говорит, что gcc обновлен. Какие-либо предложения? –

+0

Вам понадобится как минимум gcc 4.9. Проверьте, есть ли обновление для вашего дистрибутива, стабильный Debian, например, только недавно обновленный gcc до 4.9. Кроме того, вы можете [перевернуть свой собственный] (http://stackoverflow.com/a/24609331/996886), если вы не можете получить более новый компилятор. – melak47

+0

Спасибо. Я попробую это; Я уверен, что все. На данный момент я случайно начал 30-минутное обновление всего пакета. Я просто позволю ему сделать это, ха-ха. Еще раз спасибо. –

Смежные вопросы