2010-10-06 12 views
10

Se metto #include <vector.h> nel mio file sorgente, ottengo questo avvertimento:Compreso "vector.h" o "vettoriale" cause avvisi o errori

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 

e se io aggiungo regolare #include <vector> (senza .h, come suggerisce il warning), ottengo i seguenti errori:

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

c'è un modo migliore per includere l'intestazione vettore questo in modo che non si lamenta? Ecco il file sorgente che genera le avvertenze/errori:

// 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_*/ 
+3

se si sta scrivendo codice C++, non rovinare le intestazioni di stile c. utilizzare e . le intestazioni di stile c possono essere utilizzate come intestazione in stile C++: . – Donotalo

+6

'_MYNN_H_' è un identificatore riservato, [non utilizzarlo] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier). – GManNickG

risposta

30

Il problema è che vector<T> vive nel std spazio dei nomi e si sta tentando di utilizzare il tipo senza alcuna qualifica o appropriate using dichiarazione. La correzione più sicura consiste nel qualificare esplicitamente gli usi del tipo con il prefisso std.

std::vector<neuron> nrns; 

Questo può anche essere fissato importando in modo esplicito il tipo tramite una dichiarazione using.

using std::vector; 

Eviterei comunque questo approccio. L'aggiunta delle istruzioni using ai file di intestazione, mentre è legale, è una cattiva pratica perché può modificare la modalità di compilazione degli articoli. Questa forma è più sicura di un'importazione coperta di std ma non è ancora eccezionale.

+1

Significa "usare lo spazio dei nomi std;" –

+9

"utilizzo dello spazio dei nomi ..." è corrugato da abbastanza persone da considerare l'alternativa - solo "usando" ciò di cui si ha realmente bisogno. Cioè 'usando std :: vector;'. – delnan

+0

@Fred, grazie doh – JaredPar

15

vector appartiene allo spazio dei nomi std. È necessario qualificarsi completamente come std::vector<int>.

Devo chiarire che lo standard C++ consente di utilizzare tutte le opzioni fornite da JaredPar nella sua risposta, ma consiglio vivamente di non utilizzare using namespace std e in particolare nei file di intestazione. A proposito di using namespace std puoi trovare l'opinione ben descritta nella domanda this. Personalmente sono d'accordo, quindi permettimi di collegarlo alla mia risposta.

2

Infatti, è necessario specificare std :: vector come vettore non è globale. Ma preferirei consigliare di NON usare la parola chiave using.

Il problema è lo scopo dell'utilizzo e i conflitti che potrebbero verificarsi dopo. INOLTRE se stai pianificando di avere un'app portatile (codice), (specialmente per la libreria) dovresti evitare di far rumore perché non puoi essere sicuro degli effetti collaterali su altre plateform, per i futuri utenti del tuo codice.

Problemi correlati