2015-10-04 59 views
0

編輯:只是忘了添加「state_manager::」我的不好。標題中的私人類型定義?

我想創建一個簡單的狀態系統。爲了節省一些打字和稍後更容易改變,我在state_manager.hpp中加入了一些typedef。問題是這些類型定義似乎不能在我的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爲不可拷貝,所以你目前執行的pushchange將無法​​正常工作。

你可以改變他們是這樣的:

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分鐘以上的全包更新。我會讓它做它的事情,哈哈。再次感謝。 –