C++ 命名空间“std”中的“vector”没有模板类型

C++ 命名空间“std”中的“vector”没有模板类型,c++,vector,C++,Vector,因此,我的头文件中有一个定义: std::vector<char> showBytes(char const* fileName); 你知道为什么会给我这个吗 编辑: 文件.h std::vector<char> showBytes(char const* fileName); 头文件提供了其中声明的函数的接口。遇到参数类型和返回类型时,至少应该声明它们。默认情况下,不包括保存声明和定义的,您也没有转发声明。这将导致函数的返回类型未知,这使得编译器很难确定堆栈上应该为

因此,我的头文件中有一个定义:

std::vector<char> showBytes(char const* fileName);
你知道为什么会给我这个吗

编辑:

文件.h

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

头文件提供了其中声明的函数的接口。遇到参数类型和返回类型时,至少应该声明它们。默认情况下,不包括保存声明和定义的,您也没有转发声明。这将导致函数的返回类型未知,这使得编译器很难确定堆栈上应该为返回值保留多少空间

在使用它的每个编译单元C++文件中包含头文件之前,声明应该存在于编译单元中。然而,这是相当笨拙的。但是,通过简单地将其包含在头文件中也可以获得相同的结果,这样您就不依赖于包含的顺序

文件.h:

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

另一方面,您可能还希望在File.cpp;它包含ifstream的声明。“包含”防护栏也知道当前不需要标题防护栏,但我还是添加了它,因为它可以为您节省一些麻烦。

是否包含?是的,我添加了。它在C++文件中,它在C++文件中。冒着明显的下一个问题,这个代码出现在C++中的同一个C++文件中。您可以通过在不使用该CPP文件的情况下编译标头来检查是否正确,或者您可以编写一个CPP文件,该文件除了包含标头之外不做任何事情,并编译该标头。请注意,以下划线开头,后跟大写字母的名称以及包含两个连续下划线的名称保留供实现使用。不要在你的代码中使用它们。@PeteBecker虽然我隐约记得在你发表评论之前读过类似的东西,但它从未给我带来任何问题。因此,当我写下答案时,我并没有完全想到这一点。无论如何,我已经根据你的建议更新了答案。
std::vector<char> showBytes(char const* fileName);
#ifndef FILE_H
#define FILE_H
#include <vector>
std::vector<char> showBytes(char const* fileName);
#endif // FILE_H