使用标题时C ++函数抛出错误,但如果我在源代码中定义它则不会抛出错误?

时间:2011-08-04 20:05:33

标签: c++ function vector header definition

当我尝试使用多个文件时,我在编译函数时遇到了一个奇怪的问题。我把它归结为这个简单的例子:假设我想找到整数向量的总和。如果我尝试编译以下代码,它会按预期工作:

#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文件中的代码相同,因此问题必须在标题中。我有什么想法吗?

5 个答案:

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

尽量避免在头文件中使用命名空间以避免名称冲突。