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

'vector' in namespace 'std' does not have a template type

本文关键字:类型 中的 std 命名空间 vector      更新时间:2023-10-16

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

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);

标头文件提供了其中声明的函数的接口。参数类型以及返回类型至少应在遇到时声明。默认情况下,不包括<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的声明。当前没有必要的后卫(也知道是标头后卫(,但是我添加了它,因为它可以为您节省一些麻烦。