Функция C ++ выдает ошибку, когда я использую заголовок, но не если я определю его в источнике? - PullRequest
2 голосов
/ 05 августа 2011

У меня странная проблема с компиляцией функции, когда я пытаюсь использовать несколько файлов. Я свел это к следующему простому примеру: предположим, я хочу найти сумму вектора целых чисел. Если я попытаюсь скомпилировать следующий код, он будет работать как положено:

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

Однако, если я пытаюсь использовать файл заголовка, он падает на моем компьютере (ошибка C4430 при компиляции на VS 2010 для Windows XP). Вот код для другого подхода:

заголовок:

/* 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 ]

3 голосов
/ 05 августа 2011
#pragma once
#include <vector>
int VectorSum (const std::vector<int>& values);
                     ^^^^^

См. страницу MSDN для C4430 . Выдается в случае, если в объявлении отсутствует тип или тип неизвестен. В вашем случае vector является неизвестным типом из-за неквалифицированных правил поиска имени.

2 голосов
/ 05 августа 2011

Это проблема с пространством имен std.

Измените объявление в заголовке на:

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

И убедитесь, что в файлах .cpp есть (using namespace std;) (как в первом примере) или что вы используете пространство имен std соответствующим образом при вызове / определении функции. Например, вам нужно сделать одну из этих вещей в вашем файле VectorSum.cpp.


В качестве отступления, пожалуйста не добавьте

using namespace std;

оператор в заголовочный файл. Это заставит пространство имен быть введенным в область действия для всех пользователей заголовка (даже если оно косвенно включено, поэтому оно может быть неочевидным), что может не соответствовать их потребностям или потребностям.

0 голосов
/ 05 августа 2011

Добавить using namespace std

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

Старайтесь избегать использования пространства имен в заголовочных файлах, чтобы избежать конфликтов имен.

0 голосов
/ 05 августа 2011

Вы должны указать пространство имен для вектора в VectorSum.h:

int VectorSum (const std::vector<int>& values);
0 голосов
/ 05 августа 2011

Проблема действительно в заголовочном файле.Вы забыли добавить

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
...