use*_*113 3 c++ stl typedef compiler-errors
我写的一些代码有一个非常讨厌的问题.我发现其他人在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;
Run Code Online (Sandbox Code Playgroud)
some_file.cpp中的包含是:
#include <utility>
#include <map>
#include <vector>
#include <iostream>
#include <string>
#include <stdio.h>
#include <cc++/file.h>
#include "some_file.h"
Run Code Online (Sandbox Code Playgroud)
测试文件只包含该顺序的字符串,矢量和我的文件.它有一个主要的方法,只是做一个问候世界的事情.
有趣的是,我很快就把一个模板化的课程拼凑在一起,看看问题出在哪里(用" std::map<Column..."替换" hello<Column..."),它没有问题.
如果您使用的是没有' <'运算符的类,我已经创建了地图所需的运算符重载.
A. *_*evy 14
您遇到此问题是因为编译器不知道映射是什么.它不知道,因为尚未包括地图标题.您的标头使用STL模板:字符串,矢量,地图和对.但是,它没有定义它们,也没有任何参考它们的定义.您的测试文件barfs在地图上而不是在字符串或向量上的原因是您在some_file.h之前包含字符串和向量标题,因此定义了字符串和向量,但是映射不是.如果你包含map的标题,它会起作用,但是它可能会抱怨pair(除非你的特定STL实现在map的标题中包含对).
通常,最好的策略是为您在自己的标头中使用的每种类型包含适当的标准标头.所以some_file.h至少应该有这些标题:
#include <string>
#include <map>
#include <utility> // header for pair
#include <vector>
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是预处理器必须每次都加载每个文件并进行#ifdef... #endif条件包含处理,因此如果你有数千个文件,并且每个文件包含数十个文件,这可能会显着增加你的编译时间.但是,在大多数项目中,必须手动管理标头包含的额外加重并不值得在编译时获得微不足道的收益.这就是为什么斯科特迈耶斯的有效STL书籍第48项 "总是#include正确的标题" .
您应该将其中一些包含转移到头文件中.这些需要放在你的typedef语句之前.
即
#include <map>
#include <string>
#include <map>
Run Code Online (Sandbox Code Playgroud)
否则,包括some_file.h在内的任何其他内容(例如您的主程序)都不会知道它们是什么,除非它还在主程序源文件中的#include"some_file.h"include指令之前放置这些包含.如果你这样做,问题应该消失.
| 归档时间: |
|
| 查看次数: |
11037 次 |
| 最近记录: |