C++ avec XCode, vector et local type

Résolu/Fermé
Utilisateur anonyme - 7 févr. 2010 à 16:16
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 févr. 2010 à 09:37
Bonjour,
Je commence le C++ et j'ai un petit problème...
XCode (IDE d'Apple, j'utilise Snow Leopard) me sort une erreur quand j'essaye de déclarer un vecteur d'une structure définie auparavant. Exemple :
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main ()
{
	string name;
	int num,n,i;
	double prix;
	bool d=false;
	struct Object
	{
		string nom;
		int numero;
		double prix;
	};
	vector<Object> cata;
	cout<<"Constitution du catalogue, suivez les instructions, tapez false pour arrêter et true pour continuer"<<endl;
	while(cin)
	{
		cout<<"Nom de l'objet : ";
		cin>>name;
		cout<<endl<<"Numéro de l'objet : ";
		cin>>num;
		cout<<endl<<"Prix : ";
		cin>>prix;
	    Object o;
		o.nom=name;
		o.numero=num;
		o.prix=prix;
		cata.push_back(o);
		cin;
	}
	for(i=0;i<3;i++)
	{
		cout<<endl<<"Quel objet cherchez-vous ?";
		cin>>name;
		for(n=0;n<cata.size();n++)
		{
			if(strcmp(cata[n].nom,name))
			{
				cout<<"Prix : "<<cata[n].prix<<"€  --  Numéro : "<<cata[n].numero<<endl;
				d=true;
				break;
			}
		}
		if(!d) cout<<"L'objet n'est pas dans le catalogue !"<<endl;
	}
	return 0;
}


J'obtiens l'erreur :
error: template argument for 'template<class _Alloc> class std::allocator' uses local type 'main()::Object'


J'ai essayé sous Visual Studio sous WinXP et cette erreur n'apparait pas... Avez-vous une idée de la provenance de l'erreur ?
Merci d'avance

3 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 févr. 2010 à 09:37
Je pense avoir compris l'erreur. "Objet" est un "type" propre à la fonction main(), c'est à dire qu'en dehors ça n'existe pas. vector est basé sur les template, donc le compilateur a besoin de connaître certaines information sur ce qui est passé au template pour pouvoir générer ce qu'il faut. Et c'est ça qui doit coincé car il ne peut instancier vector<Objet> en dehors du main où Objet n'existe pas.

C'est peut être une limitation du compilateur. Il faudrait savoir ce que dit l'ISO à ce sujet. Certains compilateur ne supportent pas toutes les normes ISO, mais inversement propose des choses qui ne sont pas ISO (dangereux lorsqu'on veux faire un code portable)
2
Utilisateur anonyme
10 févr. 2010 à 08:45
Bonjour,
J'ai résolu mon problème : il est tout à fait possible de faire des vector avec des structures, il faut simplement déclarer la structure hors de la fonction main().
Merci pour ton aide.
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
7 févr. 2010 à 20:40
on fait des vector avec des classes, pas des structures.

Par contre ce que tu peux faire, si tu ne veux vraiment pas faire de classes, c'est faire un vecteur de pointeur vers des Object, je pense que ça marche (par contre ça va etre prise de tête au niveau de la mémoire, allocation dynamique etc. ...)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 févr. 2010 à 09:31
struct n'a rien à voir là dedans. En C++, il n'y a q'UNE différence entre class et struct c'est la protection par défaut des membres : public pour struct et private pour class.
0