2010-07-28 8 views
0

C'est bizarre. J'ai créé un vecteur très bien dans une classe mais je ne peux pas le créer dans une autre classe. Il est une représentation de ce que j'ai:C++ ne peut pas créer de vecteur

main.h

#include <Windows.h> 
#include <ShellAPI.h> 
#include <vector> 
#include <string> 
#include <iostream> 

#include "taco.h" 

class MyClass 
{ 

public: 
    int someint; 
    vector<int> myOrder; 
}; 

taco.h

#include <vector> 

class OtherClass 
{ 

public: 
    vector<int> otherOrder; 
}; 

Et je reçois des erreurs de compilation en ce qui concerne la déclaration de vecteur taco.h:

error C2143: syntax error : missing ';' before '<' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2238: unexpected token(s) preceding ';' 

Qu'est-ce qui me manque ici? Je peux décommenter cette deuxième déclaration de vecteur et il compile bien.

+4

Cela me porte à croire que certains .h a 'using namespace std;' en elle quelque part, ce qui est généralement une mauvaise idée. 'using 'ne devrait jamais être fait dans les en-têtes, car il gâche les espaces de noms pour tout fichier .cpp qui inclut directement ou indirectement cet en-tête. Laissez 'using' pour les fichiers source seulement, où les effets sont locaux. –

Répondre

11

Essayez:

std::vector<int> otherOrder; 

vector fait partie de l'espace de noms std. Cela signifie que lorsque vous utilisez un vector dans un fichier d'en-tête, vous devez inclure le préfixe std::.

La raison pour laquelle vous pouvez parfois vous en passer en l'oubliant est que certains fichiers inclus peuvent contenir using namespace std;, ce qui vous permet de ne pas utiliser le préfixe. Cependant, vous devriez éviter le mot-clé using dans les fichiers d'en-tête, car il va polluer l'espace de noms de tous les fichiers que include il. Pour une explication plus détaillée des dangers de using namespace ..., voir this thread.

+1

[Cette réponse] (http://stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-for-cout-cerr-cin-and-endl/2880136#2880136) est un autre argument contre 'using namespace std'. – sbi

+0

@sbi: Merci, bon argument. –

+0

Hmmm pour une raison quelconque, je pensais que mon "using namespace std" dans main.h descendrait en taco.h. Merci d'avoir répondu! –

3

Essayez std::vector<int>. Vous êtes censé utiliser l'espace de noms --- Je suppose que vous avez

using namespace std; 

dans le quelque part main.h. Il y a beaucoup de discussions sur SO pour savoir pourquoi utiliser using est une mauvaise pratique; Je vous recommande de vérifier.

3

Tous les objets de bibliothèque standard C++ résident dans l'espace de noms std. Essayez

class MyClass 
{ 

public: 
    int someint; 
    std::vector<int> myOrder; 
// ^^^^^ 
}; 
Questions connexes