Comment avoir un uneredered_map où le type de valeur est la classe dans laquelle il est?

Ce code:

class Foo { std::unordered_map x; }; 

me donne une erreur:

 /usr/include/c++/4.7/bits/stl_pair.h:94:11: error: 'std::pair::second' has incomplete type foo.cpp:4:7: error: forward declaration of 'class Foo' 

Cependant, ce code comstack parfaitement:

 class Foo { std::vector x; }; 

Est-ce un bug de bibliothèque / compilateur?

La norme C ++ spécifie pour les différents pointeurs intelligents que le paramètre de modèle est autorisé à être un type incomplet.

Cette information n’est pas donnée pour les types de conteneur. Comme elle est non spécifiée, une implémentation est autorisée à accepter un type incomplet pour un modèle de classe de conteneur et non un autre, tout en restant conforme.

Pour rendre votre code portable, évitez de créer des conteneurs de tout type avant que le type ne soit terminé.

Formellement, cette contrainte se trouve dans la règle suivante (17.6.4.8) qui s’applique à votre code:

Dans certains cas (fonctions de remplacement, fonctions de gestionnaire, opérations sur les types utilisés pour instancier des composants de modèle de bibliothèque standard), la bibliothèque standard C ++ dépend de composants fournis par un programme C ++. Si ces composants ne répondent pas à leurs exigences, la norme n’impose aucune exigence pour la mise en œuvre.

En particulier, les effets ne sont pas définis dans les cas suivants:

  • si un type incomplet est utilisé comme argument de modèle lors de l’instanciation d’un composant de modèle, sauf autorisation spécifique de ce composant.