C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

emplacement de la déf d'une struct pour utilisation avec un

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Jseb
Guest





PostPosted: Thu May 10, 2007 5:59 pm    Post subject: emplacement de la déf d'une struct pour utilisation avec un Reply with quote



Bonjour,

Pourquoi ne peut-on pas spécifier la définition d'une structure au
sein d'une fonction ? Est-ce spécifique aux containeurs ?
Si je défini la struct en dehors de main(), ça compile sans problèmes.

Un copain m'a dit que les containers laissaient la possibilité de
définir une fonction d'allocation en tant que deuxième argument, et
que mon erreur venait de là. Mais je ne vois pas le rapport avec le
fait de définir la structure en dehors de la fonction ?
Est-ce un problème de non existence de la structure au stade où le
vector est évalué par le compilateur ?

Merci.


#include <iostream>
#include <vector>
#include <iterator>
#include <string>

int main()
{
struct Mastruct { int nombre; std::string chaine; };
std::vector<Mastruct> mastruct;

return 0;
}

~$ g++ struct_vec.c++
struct_vec.c++: In function `int main()':
struct_vec.c++:9: error: `main()::Mastruct' uses local type
`main()::Mastruct'
struct_vec.c++:9: error: trying to instantiate `template<class
_Alloc> class std::allocator'
struct_vec.c++:9: error: template argument 2 is invalid
struct_vec.c++:9: error: invalid type in declaration before ';' token
Back to top
alexandre
Guest





PostPosted: Thu May 10, 2007 6:24 pm    Post subject: Re: emplacement de la déf d'une struct pour utilisation ave Reply with quote



bonjour,

"Jseb" <jseb (AT) alussinan (DOT) org> a écrit dans le message de
news:od5643pi5pvpr69e57vunsd2evjugmuru6 (AT) 4ax (DOT) com...
Quote:
Bonjour,

Pourquoi ne peut-on pas spécifier la définition d'une structure au
sein d'une fonction ? Est-ce spécifique aux containeurs ?
Si je défini la struct en dehors de main(), ça compile sans problèmes.

Un copain m'a dit que les containers laissaient la possibilité de
définir une fonction d'allocation en tant que deuxième argument, et
que mon erreur venait de là. Mais je ne vois pas le rapport avec le
fait de définir la structure en dehors de la fonction ?
Est-ce un problème de non existence de la structure au stade où le
vector est évalué par le compilateur ?


la définition de ta structure (ça serait pareil pour n'importe quel type)
étant locale à main, le nom n'existe que dans celle-ci et donc n'est pas
utilisable dans vector (ni dans aucun autre template, d'ailleurs), comme te
le dit bien gcc.
Back to top
James Kanze
Guest





PostPosted: Thu May 10, 2007 11:17 pm    Post subject: Re: emplacement de la déf d'une struct pour utilisation avec Reply with quote



On May 10, 2:59 pm, Jseb <j...@alussinan.org> wrote:

Quote:
Pourquoi ne peut-on pas spécifier la définition d'une structure au
sein d'une fonction ?

On peut. Je le fais souvent, même.

Quote:
Est-ce spécifique aux containeurs ?

Comment, spécifique aux containeurs ? Quel rapport entre une
structure que tu définis un un containeur ?

Quote:
Si je défini la struct en dehors de main(), ça compile sans problèmes.

Un copain m'a dit que les containers laissaient la possibilité de
définir une fonction d'allocation en tant que deuxième argument, et
que mon erreur venait de là. Mais je ne vois pas le rapport avec le
fait de définir la structure en dehors de la fonction ?
Est-ce un problème de non existence de la structure au stade où le
vector est évalué par le compilateur ?

#include <iostream
#include <vector
#include <iterator
#include <string

int main()
{
struct Mastruct { int nombre; std::string chaine; };
std::vector<Mastruct> mastruct;

Ça, en revanche, ne marche pas. Parce que c'est interdit
d'instantier un template avec un nom qui n'a pas de
« linkage » extern. Je crois qu'à l'époque, on en avait des
doutes sur l'implémentabilité.

Il me semble que la possibilité d'enlever cette restriction a
été discutée, mais je ne sais pas où il en est.

Quote:
return 0;
}

~$ g++ struct_vec.c++
struct_vec.c++: In function `int main()':
struct_vec.c++:9: error: `main()::Mastruct' uses local type
`main()::Mastruct'
struct_vec.c++:9: error: trying to instantiate `template<class
_Alloc> class std::allocator'
struct_vec.c++:9: error: template argument 2 is invalid
struct_vec.c++:9: error: invalid type in declaration before ';' token

En tout cas, ça n'a rien à voir avec l'allocateur.

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Loïc Joly
Guest





PostPosted: Thu May 10, 2007 11:54 pm    Post subject: Re: emplacement de la déf d'une struct pour utilisation ave Reply with quote

James Kanze a écrit :

Quote:
Ça, en revanche, ne marche pas. Parce que c'est interdit
d'instantier un template avec un nom qui n'a pas de
« linkage » extern. Je crois qu'à l'époque, on en avait des
doutes sur l'implémentabilité.

Il me semble que la possibilité d'enlever cette restriction a
été discutée, mais je ne sais pas où il en est.


Une proposition dans ce sens a été discutée lors de la réunion d'Oxford.
Elle est implémentable (et c'est déjà le comportement implémenté dans
VC++), mais elle se marie peut-être difficilement avec des
implémentations qui font une utilisation assez agressive de la mémoire
lors de la compilation. En gros, les utilisateurs étaient tous pour, les
implémenteurs de compilateurs étaient neutre, demandant un délai de
validation, voire contre (EDG en particulier).

La suite au prochain numéro normalement.

--
Loïc
Back to top
Jseb
Guest





PostPosted: Fri May 11, 2007 9:12 am    Post subject: Re: emplacement de la déf d'une struct pour utilisation avec Reply with quote

Tout d'abord, merci pour vos réponses.

Quote:
Pourquoi ne peut-on pas spécifier la définition d'une structure au
sein d'une fonction ?
On peut. Je le fais souvent, même.

Oui, je voulais dire : "pourquoi quand j'essaie de créer un vector
avec une structure personnelle, cela est refusé à la compilation si
cette structure est définie dans la même fonction ?"


Quote:
Est-ce spécifique aux containeurs ?
Comment, spécifique aux containeurs ? Quel rapport entre une
structure que tu définis un un containeur ?

Parce que ça ne marchait pas avec mon containeur Smile
Mais plus loin, tu réponds à ma question:

Quote:
Ça, en revanche, ne marche pas. Parce que c'est interdit
d'instantier un template avec un nom qui n'a pas de
« linkage » extern.

J'aurais dû dire "template" à la place de container, mais je n'en suis
pas encore là dans mon bouquin sur le C++. Donc je n'avais pas réalisé
que les containers étaient des templates. Je vais lire le chapitre sur
les templates.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.