问题已解决!非常感谢建设性的建议!
我无法弄清楚以下代码中的错误。我做的方式有什么问题吗?
// This is utils.h
#ifndef UTILS_H
#define UTILS_H
#include <iostream>
#include <fstream>
#include <stack>
#include <queue>
#include <vector>
#include <list>
#include <string>
#include <algorithm>
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef stack<int> si;
typedef queue<int> qi;
#define tr(c,i) for(typeof((c).begin()) i = (c).begin() ; i!=(c).end() ; ++i )
#define all(c) (c).begin(),(c).end()
#define cpresent(c,x) (find(all(c),x) != (c).end())
#endif
// ==============================================================
// Below is main.cpp
#include "utils.h"
int main() {
vi v;
}
在编译“g ++ main.cpp”时,我收到以下错误消息:
utils.h:13:错误:在'&lt;'标记之前的预期初始值设定项 utils.h:14:错误:'&lt;'标记之前的预期初始值设定项 utils.h:15:错误:'&lt;'标记之前的预期初始值设定项 utils.h:16:错误:在'&lt;'标记之前的预期初始值设定项 utils.h:17:错误:在'&lt;'标记之前的预期初始值设定项 utils.h:18:错误:在'&lt;'标记之前的预期初始值设定项 main1.cpp:在函数'int main()'中: main1.cpp:4:错误:未在此范围内声明'vi' main1.cpp:4:错误:预期`;'在'v'之前
这段代码有什么问题?当我没有#ifndefs时,utils.h曾经工作过一段时间。
答案 0 :(得分:6)
这些类型(pair
,stack
,queue
,vector
等)位于std
命名空间中。您需要在文件顶部添加using namespace std;
(通常在所有标准库包含之后),或者通过在其前面添加std::
来完全限定类型名称。
通常,最好完全限定类型名称,而不是使用using namespace
来避免名称之间的潜在冲突并使代码更清晰。你应该永远在头文件中使用using namespace std
。
(除了干净的代码之外,您还应考虑为类型使用更好,更长的名称; ii
,vii
和vvii
是非常类型的名称。)
答案 1 :(得分:3)
vector
等包含在命名空间std::
中。 不在头文件中使用using namespace std;
。否则,包含它的每个人都会获得所有std::
无论是否有意。
另外,如果这是一个旨在包含在其他文件中的实用程序标头,您可以在命名空间中包装这些类型和#define
。注意#define
不尊重命名空间,所以你要改为添加前缀:
namespace utility
{
// ...
typedef std::queue<int> qi;
// most would recommend this be in CAPS
#define utility_tr(c,i) for(typeof((c).begin()) i = (c).begin() ; i!=(c).end() ; ++i )
// ...
}
答案 2 :(得分:1)
在你的typedef之前,你应该有using namespace std;
此外,您可能希望使用比UTILS_H更不常见的名称。
答案 3 :(得分:1)
你应该写
using namespace std;
行前
typedef pair<int,int> ii;
或使用std::