命名空间'std'中的'vector'没有模板类型

时间:2017-05-02 06:09:34

标签: c++ vector

所以,我的头文件中有一个定义:

std::vector<char> showBytes(char const* fileName);

当我尝试编译程序时,它一直给我这个错误:

error: 'vector' in namespace 'std' does not name a template type

有什么理由让它给我这个?

编辑:

#include <vector>
#include "file.h"

std::vector<char> showBytes(char const* fileName) {
    std::ifstream ifs(fileName, std::ios::binary|std::ios::ate);
    std::ifstream::pos_type pos = ifs.tellg();

    std::vector<char> result(pos);

    ifs.seekg(0, std::ios::beg);
    ifs.read(&result[0], pos);

    return result;
}

File.h

std::vector<char> showBytes(char const* fileName);

1 个答案:

答案 0 :(得分:1)

头文件提供在其中声明的函数的接口。参数类型以及返回类型应至少在遇到时声明。默认情况下,不包括<vector>(包含声明和定义),也没有向前声明它。这会导致函数的返回类型未知,这使得编译器很难确定堆栈上应该为返回值保留多少空间。

通过在每个使用它的编译单元(c ++文件)中的头文件之前包含<vector>,该声明应存在于该编译单元中。然而,这是相当不利的。然而,通过简单地在头文件中包含,可以实现相同的结果,这样您就不依赖于包含的顺序。

File.h:

#ifndef FILE_H
#define FILE_H
#include <vector>
std::vector<char> showBytes(char const* fileName);
#endif // FILE_H

另一方面,您可能还想在File.cpp中包含<fstream>;它包含ifstream的声明。目前没有必要使用包含守卫(也称为头部防护),但我添加了它,因为它可以为您节省一些麻烦。