所以,我的头文件中有一个定义:
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);
答案 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的声明。目前没有必要使用包含守卫(也称为头部防护),但我添加了它,因为它可以为您节省一些麻烦。