J'essaie de comprendre pourquoi ce qui suit ne fonctionne pas. J'ai un std :: vecteur et je veux appeler une fonction membre statique de celui-ci est contenu value_type comme ceci:Appel d'une fonction membre statique d'un conteneur STL C++ valeur_type
std::vector<Vector> v;
unsigned u = v.value_type::Dim();
où le vecteur est en fait un typedef pour un type basé sur un modèle:
template <typename T, unsigned U> class SVector;
typedef SVector<double, 2> Vector; //two-dimensional SVector containing doubles
et la fonction membre statique Dim() insère réellement la dimensionnalité U du Vecteur.
Maintenant, le compilateur renvoie un message d'erreur indiquant:
error: ‘SVector<double, 2u>’ is not a base of
‘std::vector<SVector<double, 2u>, std::allocator<SVector<double, 2u> > >
qui me déconcerte. Je peux remplacer la ligne offenser apparemment par
unsigned u = Vector::Dim();
et qui fonctionne, mais il est évidemment laid comme hardcodes hypothèses sur la value_type de v ... Merci!
Merci beaucoup, c'est génial.Je ne savais pas qu'il n'était pas autorisé à accéder à value_type via l'instance. Seriez-vous par hasard savoir pourquoi cela n'est pas autorisé (ce qui irait mal si c'était permis)? – yungchin
@yungchin vérifier si l'explication que je viens d'ajouter est suffisamment claire à propos de ce problème. –
rien ne se passerait mal si elle était autorisée - puisque C++ est statiquement typé, il sait déjà que v est un std :: vector, mais là encore vous savez déjà ce que vaut v, donc cela ne fait vraiment aucune différence. Je suppose que les concepteurs C++ voulaient une séparation claire entre les membres statiques et les membres de l'instance. –