在标头中添加typedef时出错

时间:2015-06-27 17:22:30

标签: c++ dictionary header-files typedef

我是C ++的新手,我正在学习Accelerated C ++(对于有本书的人,我正在尝试运行第7.4节中描述的程序)

我正在查看的程序使用了一些typedef - 我知道如果我将这些添加到头文件中,任何包含该头文件的源文件也可以使用typedef。

我的标题是:

#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 个答案:

答案 0 :(得分:3)

它表示在命名空间map中找不到std。您需要包含它以便编译器可以找到它。同样,您需要包含std::vector std::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 :(得分: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