使用 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);
其中Files
是func1.cpp
中定义的结构
struct Files
HANDLE h;
WIN32_FIND_DATA info;
file;
我还有另一个接受 std::vector<Files> &
作为输入参数的函数,但是当我尝试编译(使用 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】:确保在您的头文件中包含<vector>
。你还提到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