Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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 ?

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

4 réponses

Avatar
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.

Avatar
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 ?

#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.

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

Avatar
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

Avatar
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.