 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jseb Guest
|
Posted: Thu May 10, 2007 5:59 pm Post subject: emplacement de la déf d'une struct pour utilisation avec un |
|
|
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
|
Posted: Thu May 10, 2007 6:24 pm Post subject: Re: emplacement de la déf d'une struct pour utilisation ave |
|
|
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
|
Posted: Thu May 10, 2007 11:17 pm Post subject: Re: emplacement de la déf d'une struct pour utilisation avec |
|
|
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
|
Posted: Thu May 10, 2007 11:54 pm Post subject: Re: emplacement de la déf d'une struct pour utilisation ave |
|
|
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
|
Posted: Fri May 11, 2007 9:12 am Post subject: Re: emplacement de la déf d'une struct pour utilisation avec |
|
|
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
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 |
|
 |
|
|
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
|
|