在程序中,头文件中定义了以下结构:
\\structs.h
#include <vector>
using std::vector;
using namespace std;
struct cell
{
double x;
vector<int> nn;
};
在单独的源文件中,我定义了函数:
\\functions.cpp
# define _CRT_SECURE_NO_DEPRECATE
# include <stdio.h>
# include <iostream>
# include <math.h>
# include <vector>
# include "structs.h"
using namespace std;
void initial_position(vector<cell>& cluster, int n)
{
cell tmp;
for (int i = 0; i < n; i++)
{
tmp.x = 1;
cluster.push_back(tmp);
}
}
带有头文件的:
//functions.h
# include <vector>
using std::vector;
void initial_position(vector<cell>& cluster, int n);
我希望在主脚本中调用此函数:
//main.cpp
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <vector>
#include "functions.h"
#include "structs.h"
using namespace std;
int main()
{
vector <cell> cluster;
int n = 100;
initial_position(cluster,n);
return 0;
}
但是会出现以下错误:
functions.h(4):错误C2065:&#39; cell&#39;:未声明的标识符
functions.h(4):错误C2923:&#39; std :: vector&#39;:&#39; cell&#39;不是参数&#39; _Ty&#39;
的有效模板类型参数functions.h(4):错误C3203:&#39;分配器&#39;:非专业化的类模板不能用作模板参数的模板参数&#39; _Alloc&#39;,预期a真实的类型
main.cpp(14):错误C2664:&#39; void initial_position(std :: vector&amp;)&#39;:无法从&#39; std :: vector&gt;&#39;转换参数1到&#39; std :: vector&amp;&#39;
错误的来源是什么?这一切似乎都很明确。
答案 0 :(得分:4)
放
#include "structs.h"
进入functions.h并用include-guard保护structs.h和functions.h,例如:
#pragma once
如果有的话。
答案 1 :(得分:2)
添加
#include "structs.h"
进入functions.h因为在functions.h中编译器不知道是什么单元格。
答案 2 :(得分:-2)
只需交换
#include "functions.h"
#include "structs.h"
与
#include "structs.h"
#include "functions.h"
由于单元格是在structs.h中声明的,因此在functions.h中是必需的。
或者更好的是,在functions.h中包含structs.h
你也不应该在标题中使用命名空间std,这是不好的做法。它可能会导致一些令人讨厌的难以发现的bug,例如, Why is "using namespace std" considered bad practice?