在C ++中包含文件错误

时间:2009-11-22 22:14:04

标签: c++ compiler-errors

问题已解决!非常感谢建设性的建议!

我无法弄清楚以下代码中的错误。我做的方式有什么问题吗?

// 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曾经工作过一段时间。

4 个答案:

答案 0 :(得分:6)

这些类型(pairstackqueuevector等)位于std命名空间中。您需要在文件顶部添加using namespace std;(通常在所有标准库包含之后),或者通过在其前面添加std::来完全限定类型名称。

通常,最好完全限定类型名称,而不是使用using namespace来避免名称之间的潜在冲突并使代码更清晰。你应该永远在头文件中使用using namespace std

(除了干净的代码之外,您还应考虑为类型使用更好,更长的名称; iiviivvii是非常类型的名称。)

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

完全限定stl的类型