2015-06-27 45 views
1

增加的typedef當我是新的C++和我正在學習從加速C++(與書的人,我想運行§7.4中描述的程序)錯誤頭

程序我正在尋找使用一些typedefs - 我收集,如果我將這些添加到頭文件,包含該頭的任何源文件也將能夠使用typedefs。

我的頭是:

#ifndef READ_GRAMMAR_H_INCLUDED 
#define READ_GRAMMAR_H_INCLUDED 

typedef std::vector<std::string> Rule; 
typedef std::vector<Rule> Rule_collection; 
typedef std::map<std::string, Rule_collection> Grammar; 

Grammar read_grammar(std::istream& in); 

#endif // READ_GRAMMAR_H_INCLUDED 

這是給我的錯誤error: 'map' in namespace 'std' does not name a type

如果我改變第三的typedef typedef std::vector<Rule_collection> Grammar;(不,我想這一點,只是舉例),它構建沒有錯誤。

任何想法是什麼問題?我不知道我是在做一些錯誤的小事,或者整個方法是不正確的

+2

你需要'#包括'''和''編輯:和''和 – AndyG

+1

''。 – chris

+0

@ rbennett485我相信地圖是間諜! –

回答

3

它說它在命名空間std中找不到map。你需要包含它,以便編譯器能夠找到它。同樣,你需要包括標頭std::vectorstd::stringstd::istream

#ifndef READ_GRAMMAR_H_INCLUDED 
#define READ_GRAMMAR_H_INCLUDED 
#include <map> 
#include <vector> 
#include <string> 
#include <istream> 

typedef std::vector<std::string> Rule; 
typedef std::vector<Rule> Rule_collection; 
typedef std::map<std::string, Rule_collection> Grammar; 

Grammar read_grammar(std::istream& in); 

#endif // READ_GRAMMAR_H_INCLUDED 

如果你覺得勇敢,你可能也想閱讀有關前置聲明 - 它們的用途,優點和缺點,但我懷疑它需要這個特殊情況。

+1

這很有道理。任何想法,爲什麼它只是給失蹤的'#包括'錯誤,雖然,而不是缺少'#包括'? – rbennett485

+0

你可能已經把它們包含在別的地方了,實際的錯誤是由包含這個頭文件的'.cpp'文件拋出的。 –

+0

@ rbennett485,可能你在這個標題之前包含的東西包括其他東西。 – chris

3

你必須包含頭文件,如果你沒有包含它們,那麼你的程序將如何使用它?

#ifndef READ_GRAMMAR_H_INCLUDED 
#define READ_GRAMMAR_H_INCLUDED 

#include <istream> 
#include <string> 
#include <vector> 
#include <map> 

typedef std::vector<std::string> Rule; 
typedef std::vector<Rule> Rule_collection; 
typedef std::map<std::string, Rule_collection> Grammar; 

Grammar read_grammar(std::istream& in); 

#endif // READ_GRAMMAR_H_INCLUDED