Включение "vector.h" или "vector" вызывает предупреждения или ошибки
Если я поставлю #include <vector.h>
в исходный файл, я получаю следующее предупреждение:
make -f Makefile CFG=Debug
g++ -c -g -o "Debug/mynn.o" "mynn.cpp"
In file included from C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/backward/vector.h:59,
from mynn.h:7,
from mynn.cpp:1:
**C:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.**
g++ -g -o "Debug/mynn.exe" Debug/mynn.o
и если я просто добавлю регулярный #include <vector>
(без .h, как подсказывает предупреждение), я получаю следующие ошибки:
make -f Makefile CFG=Debug
g++ -c -g -o "Debug/mynn.o" "mynn.cpp"
In file included from mynn.cpp:1:
**mynn.h:12: error: ISO C++ forbids declaration of `vector' with no type
mynn.h:12: error: expected `;' before '<' token
mynn.h:13: error: `vector' has not been declared
mynn.h:13: error: expected `,' or `...' before '<' token
mynn.h:13: error: ISO C++ forbids declaration of `parameter' with no type
mynn.h:20: error: ISO C++ forbids declaration of `vector' with no type
mynn.h:20: error: expected `;' before '<' token
mynn.h:21: error: ISO C++ forbids declaration of `vector' with no type
mynn.h:21: error: expected `;' before '<' token**
Есть ли лучший способ включить векторный заголовок, чтобы он не жаловался? Вот исходный файл, который генерирует предупреждения/ошибки:
// mynn.h
#ifndef _MYNN_H_
#define _MYNN_H_
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <vector>
class neuron {
public:
neuron();
vector<int> weights;
int compute_sum (vector <int> &input);
};
class layer
{
public:
layer();
vector <neuron> nrns;
vector<int> compute_layer (vector <int> &input);
};
#endif /*_MYNN_H_*/
Ответы
Ответ 1
Проблема заключается в том, что vector<T>
живет в пространстве имен std
, и вы пытаетесь использовать этот тип без какой-либо квалификации или соответствующего оператора using
. Самым безопасным решением является явно квалифицировать использование типа с префиксом std
.
std::vector<neuron> nrns;
Это также можно устранить, явно импортируя этот тип с помощью инструкции using
.
using std::vector;
Я бы избегал этого подхода. Добавление операторов using
в заголовочные файлы, в то время как законные, является плохой практикой, потому что это может изменить способ компиляции элементов. Эта форма более безопасна, чем общий импорт std
, но по-прежнему невелика.
Ответ 2
vector
принадлежит пространству имен std
. Вам нужно полностью определить его имя как std::vector<int>
.
Мне нужно уточнить, что С++ Standard позволяет использовать все параметры, которые JaredPar дал в своем ответе, но я настоятельно рекомендую не использовать using namespace std
и особенно в файлах заголовков. О using namespace std
вы можете найти хорошо описанное мнение в этом вопросе. Лично я согласен с этим, поэтому позвольте мне связать его в моем ответе.
Ответ 3
Действительно,
вам нужно указать std::vector, поскольку вектор не является глобальным.
Но я бы скорее посоветовал вам НЕ использовать ключевое слово using
.
Проблема заключается в области использования и конфликтах, которые могут возникнуть после.
MOREOVER, если вы планируете иметь портативные приложения (код) (особенно для библиотеки), вы должны избегать того, что вы не можете быть уверены в побочных эффектах на других форматах, для будущих пользователей вашего кода.