2015-06-27 3 views
1

Я новичок в C++, и я учусь от Accelerated 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 std::vector<Rule_collection> Grammar; (не то, что Я хочу это, просто к примеру) он строит без ошибок ,

Любая идея, в чем проблема? Я понятия не имею, делаю ли я что-то тривиальное неправильным образом или неверен весь подход

+2

Вам нужно для '#include ' '' и '' редактирования: и '' AndyG

+1

и '' . – chris

+0

@ rbennett485 Я уверен, что карта - шпион! –

ответ

3

Он говорит, что не может найти map в пространстве имен std. Вам нужно включить его, чтобы компилятор мог его найти. Кроме того, вам необходимо включить заголовки для std::vectorstd::string и std::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

Это имеет смысл. Любая идея, почему она только выдавала ошибку для отсутствующего '#include ' хотя, а не для отсутствующего '#include '? – 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