使用 std::vector 作为标头中的输入参数定义函数的原型

Posted

技术标签:

【中文标题】使用 std::vector 作为标头中的输入参数定义函数的原型【英文标题】:Define the prototype of a function with a std::vector as input parameter in an header 【发布时间】:2011-09-29 21:41:09 【问题描述】:

我快疯了,因为我无法定义我实际使用的函数的原型。 我正在做的是创建一个名为func1.h的头文件,我在其中定义了这个原型(那是因为我需要从其他地方实现的其他函数调用这个函数):

void FileVector(std::vector<Files> &,const char*,bool);

其中Filesfunc1.cpp中定义的结构

struct Files
        HANDLE h;
        WIN32_FIND_DATA info;
         file;

我还有另一个接受 std::vector&lt;Files&gt; &amp; 作为输入参数的函数,但是当我尝试编译(使用 Eclipse C++)时,我得到了这些错误:

/FileVector.h:11:22: error: variable or field 'FileVector' declared void
..\/FileVector.h:11:17: error: 'vector' is not a member of 'std'
..\/FileVector.h:11:29: error: 'Files' was not declared in this scope

我尝试在头文件中包含几个指令。例如,在头文件中声明结构并包含向量头文件就可以解决问题,但是这样我得到了很多“多个定义/第一次在这里定义”错误。 我能做什么?

编辑

现在我的标题看起来像:

#ifndef FILEVECTOR_H_
#define FILEVECTOR_H_
#include <vector>
#include <windows.h>

 struct Files
        HANDLE h;
        WIN32_FIND_DATA info;
        ;

 void FileVector(std::vector<Files> &,const char*,bool);

 #endif /* FILEVECTOR_H_ */

此时,我需要在另一个头文件中声明另一个原型:

void ProcessInput(vector<Files>&);

但我不能使用与上述相同的技巧,因为我必须重新定义 Files 结构。我该如何解决这个问题?

【问题讨论】:

如果您发布了complete, minimal example,您可能会得到更好的答案。不看代码就很难猜出它的确切结构。 【参考方案1】:

确保在您的头文件中包含&lt;vector&gt;。你还提到Files的定义在cpp文件中,你也应该把它移到文件头。

同时放置适当的标头保护以避免多个定义错误:

#ifndef MY_HEADER_FILE_GUARD
#define MY_HEADER_FILE_GUARD

... your content here ...

#endif /*MY_HEADER_FILE_GUARD*/

更新: 只需在新标题中包含filevector.h 即可。但是,看起来 Files 应该在自己的标头中定义,并包含在使用它的两个标头中。

【讨论】:

如果我需要声明另一个原型,具有相同的输入参数,但在另一个标题中?我刚刚对原始帖子进行了更准确的编辑。谢谢。 我正要问你为什么不使用#pragma once 而不是标题保护,但我刚刚发现 (en.wikipedia.org/wiki/Pragma_once) 它是非标准的!

以上是关于使用 std::vector 作为标头中的输入参数定义函数的原型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::vector 作为 C# 的参数调用非托管 C++ 函数?

C++ std::vector 作为 std::function 的参数

传递 opencv inputarray 并将其用作 std::vector

具有两个输入参数的 std::vector 构造函数[重复]

如何在编译时获得多维 std::vector 的深度?

std::vector<std::string> 到 char* 数组