当我尝试使用多个文件时,我在编译函数时遇到了一个奇怪的问题。我把它归结为这个简单的例子:假设我想找到整数向量的总和。如果我尝试编译以下代码,它会按预期工作:
#include <vector>
#include <iostream>
using namespace std;
int VectorSum (const vector<int>& values)
{
int S = 0;
for (int t=0; t < values.size(); t++)
{
S += values[t];
}
return S;
}
int main()
{
vector<int> values;
values.push_back(-100);
values.push_back(75);
values.push_back(75);
cout << "Total = " << VectorSum(values) << endl << endl;
cin.ignore(1, '\n');
return 0;
}
但是,如果我尝试使用头文件,它会在我崩溃时崩溃(在VS 2010 for Windows XP上编译时出现错误C4430)。这是另一种方法的代码:
标题:
/* VectorSum.h */
#pragma once
#include <vector>
int VectorSum (const vector<int>& values);
来源:
/* VectorSum.cpp */
#include "VectorSum.h"
#include <vector>
int VectorSum (const vector<int>& values)
{
int S = 0;
for (int t=0; t < values.size(); t++)
{
S += values[t];
}
return S;
}
实施:
/* Main.cpp */
#include "VectorSum.h"
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> values;
values.push_back(-100);
values.push_back(75);
values.push_back(75);
cout << "Total = " << VectorSum(values) << endl << endl;
cin.ignore(1, '\n');
return 0;
}
正如您所看到的,VectorSum.cpp中函数的代码与我的第一个.cpp文件中的代码相同,因此问题必须在标题中。我有什么想法吗?
答案 0 :(得分:3)
#pragma once
#include <vector>
int VectorSum (const std::vector<int>& values);
^^^^^
见the MSDN page for C4430。如果声明缺少类型或类型未知,则发出它。在您的情况下,由于名称查找规则不合格,vector
是未知类型。
答案 1 :(得分:2)
这是std
命名空间的问题。
将标题中的声明更改为:
int VectorSum (const std::vector<int>& values);
确保.cpp文件中有using namespace std;
(如第一个示例)或者在调用/定义函数时适当使用std
命名空间。例如,您需要在VectorSum.cpp
文件中执行以下操作之一。
顺便说一句,请不要添加
using namespace std;
头文件的语句。这将迫使命名空间进入标题的所有用户的范围(即使它是间接包含的,因此可能并不明显),这可能不符合他们的需要或需要。
答案 2 :(得分:0)
问题确实存在于头文件中。你忘了添加
using namespace std;
到标题,因此编译器不知道vector
的含义。
更正了标题:
/* VectorSum.h */
#pragma once
#include <vector>
using namespace std; // This was missing
int VectorSum (const vector<int>& values); // Now OK, the compiler knows vector
答案 3 :(得分:0)
您必须在VectorSum.h中指定矢量的命名空间:
int VectorSum (const std::vector<int>& values);
答案 4 :(得分:0)
添加using namespace std
/* VectorSum.h */
#pragma once
#include <vector>
<--------
//using namespace std;
int VectorSum (const std::vector<int>& values);
尽量避免在头文件中使用命名空间以避免名称冲突。