emplacement de la déf d'une struct pour utilisation avec un container.
4 réponses
Jseb
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 ?
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
alexandre
bonjour,
"Jseb" a écrit dans le message de news:
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.
bonjour,
"Jseb" <jseb@alussinan.org> a écrit dans le message de
news:od5643pi5pvpr69e57vunsd2evjugmuru6@4ax.com...
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.
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.
James Kanze
On May 10, 2:59 pm, Jseb wrote:
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.
Est-ce spécifique aux containeurs ?
Comment, spécifique aux containeurs ? Quel rapport entre une structure que tu définis un un containeur ?
Si je défini la struct en dehors de main(), ça compile sans problèm es.
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 ?
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.
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: 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
On May 10, 2:59 pm, Jseb <j...@alussinan.org> wrote:
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.
Est-ce spécifique aux containeurs ?
Comment, spécifique aux containeurs ? Quel rapport entre une
structure que tu définis un un containeur ?
Si je défini la struct en dehors de main(), ça compile sans problèm es.
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 ?
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.
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@gmail.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
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.
Est-ce spécifique aux containeurs ?
Comment, spécifique aux containeurs ? Quel rapport entre une structure que tu définis un un containeur ?
Si je défini la struct en dehors de main(), ça compile sans problèm es.
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 ?
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.
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: 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
Loïc Joly
Ç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
Ç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).
Ç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
Jseb
Tout d'abord, merci pour vos réponses.
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 ?"
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:
Ç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.
Tout d'abord, merci pour vos réponses.
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 ?"
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:
Ç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.
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 ?"
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:
Ç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.