加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C STL map typedef错误

发布时间:2020-12-16 06:45:11 所属栏目:百科 来源:网络整理
导读:我写的一些代码有一个非常讨厌的问题.我发现其他人在stackoverflow上有同样的问题,我尝试了解决方案,但没有一个对我有用. 我键入了几个我正在使用的常见STL类型,除了我尝试键入地图时,没有其他任何问题. 我得到一个“some_file.h:83:错误:在’'之前的预期
我写的一些代码有一个非常讨厌的问题.我发现其他人在stackoverflow上有同样的问题,我尝试了解决方案,但没有一个对我有用.

我键入了几个我正在使用的常见STL类型,除了我尝试键入地图时,没有其他任何问题.
我得到一个“some_file.h:83:错误:在’<'之前的预期初始化程序将标题包含在测试程序中时出现“令牌”错误. 这是标题的重要部分(some_file.h):

#ifndef SOME_FILE_H
#define SOME_FILE_H
// some syntax-correct enums+class prototypes
typedef std::string str;
typedef std::vector<Column> col_vec;
typedef col_vec::iterator col_vec_i;
typedef std::vector<Row> row_vec;
typedef row_vec::iterator row_vec_i;
typedef std::vector<str> str_vec;
typedef str_vec::iterator str_vec_i;
typedef std::vector<Object> obj_vec;
typedef obj_vec::iterator obj_vec_i;
typedef std::map<Column,Object> col_obj_map; // error occurs on this line
typedef std::pair<Column,Object> col_obj_pair;

some_file.cpp中的包含是:

#include <utility>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <stdio.h>
#include <cc++/file.h>
#include "some_file.h"

测试文件只包含该顺序的字符串,矢量和我的文件.它有一个主要的方法,只是做一个问候世界的事情.

有趣的是,我很快就把一个模板化的类放在一起,看看问题出在哪里(用“hello< Column ......”替换“std :: map< Column ...”),它没有问题. 如果您使用的是没有’<'的类,我已经创建了地图所需的运算符重载操作符.

解决方法

您遇到此问题是因为编译器不知道映射是什么.它不知道,因为尚未包括地图标题.您的标题使用STL模板:字符串,矢量,地图和&对.但是,它没有定义它们,也没有任何参考它们的定义.您的测试文件barfs在地图上而不是在字符串或向量上的原因是您在some_file.h之前包含字符串和向量标题,因此定义了字符串和向量,但是映射不是.如果你包含map的标题,它会起作用,但是它可能会抱怨pair(除非你的特定STL实现在map的标题中包含对).

通常,最好的策略是为您在自己的标头中使用的每种类型包含适当的标准标头.所以some_file.h至少应该有这些标题:

#include <string>
#include <map>
#include <utility> // header for pair
#include <vector>

这种方法的缺点是预处理器每次都必须加载每个文件并通过#ifdef … #endif条件包含处理,所以如果你有数千个文件,并且每个文件包含数十个文件,这可能会增加你的编译时间显着.但是,在大多数项目中,必须手动管理标头包含的额外加重并不值得在编译时获得微不足道的收益.
这就是为什么斯科特迈耶斯的Effective STL书籍“始终#include正确的标题”为item #48.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读