当我使用头时,C++函数抛出错误,但如果我在源代码中定义它,就不会抛出错误

C++ function throws error when I use a header, but not if I define it in source?

本文关键字:错误 出错 源代码 定义 C++ 函数 如果      更新时间:2023-10-16

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

#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;
}

但是,如果我尝试使用头文件,它会在我的上崩溃(在Windows XP的VS 2010上编译时出错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文件中的代码相同,所以问题一定出在标头中。你知道我做错了什么吗?

#pragma once
#include <vector>
int VectorSum (const std::vector<int>& values);
                     ^^^^^

有关C4430,请参阅MSDN页面。它是在声明缺少类型或类型未知时发出的。在您的情况下,由于不合格的名称查找规则,vector是未知类型。

这是std命名空间的问题。

将标题中的声明更改为:

int VectorSum (const std::vector<int>& values);

并确保.cpp文件中有一个using namespace std;(如第一个示例(,或者在调用/定义函数时适当使用std命名空间。例如,您需要在VectorSum.cpp文件中执行以下操作之一。


顺便说一句,请不要添加

using namespace std;

语句添加到头文件。这将迫使名称空间进入标头的所有用户的范围(即使它是间接包含的,所以可能不明显(,这可能不符合他们的需求。

问题确实在头文件中。您忘记添加

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

您必须在VectorSum.h:中指定向量的命名空间

int VectorSum (const std::vector<int>& values);

添加using namespace std

/* VectorSum.h */
#pragma once
#include <vector>
<--------
//using namespace std;
int VectorSum (const std::vector<int>& values);

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

相关文章: