54 votes

std::to_string - plus d'une instance de la fonction surchargée correspond à la liste d'arguments

counter est un int

void SentryManager::add(std::string name,std::shared_ptr<Sentry>){
    name = name + std::to_string(counter);
}

Quel serait le meilleur moyen d'empêcher cette erreur ? Quand j'étais paresseux, j'ai juste fait l'int long long (ou autre), mais je suis sûr qu'il y a une meilleure façon de résoudre ce problème.

Message d'erreur :

sentrymanager.cpp(8): error C2668: 'std::to_string' : ambiguous call to overloaded function

J'utilise Visual C++ 2010 Express.

0 votes

Pourriez-vous inclure le message d'erreur réel, ainsi que le compilateur et la version que vous utilisez (non reproductible avec GCC 4.5).

87voto

ildjarn Points 38377

En VC++ 2010, il existe trois surcharges de l'option std::to_string en prenant long long , unsigned long long et long double respectivement. Clairement, int n'est rien de tout cela, et aucune conversion n'est meilleure qu'une autre ( Démonstration en ligne ), la conversion ne peut donc pas se faire de manière implicite/non ambiguë.

En ce qui concerne la prise en charge réelle de C++11, il s'agit d'une défaillance de l'implémentation de la bibliothèque standard de VC++ 2010. neuf surcharges de std::to_string (§21.5) :

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);

Si toutes ces surcharges avaient été présentes, il est évident que vous n'auriez pas ce problème. Bien sûr, VC++ 2010 n'était pas basé sur la norme C++11, qui n'existait pas encore à l'époque de sa sortie, mais plutôt sur la norme N3000, qui n'exigeait pas ces surcharges supplémentaires. Par conséquent, il est difficile de rejeter la faute sur VC++. trop beaucoup ici...

Dans tous les cas, il n'y a rien de mal à utiliser un casting pour résoudre soi-même l'ambiguïté :

void SentryManager::add(std::string& name, std::shared_ptr<Sentry>){
    name += std::to_string(static_cast<long long>(counter));
}

3 votes

Toutes les surcharges sont présentes dans la version bêta de Visual C++ 11. Ce n'est pas vraiment un défaut de l'implémentation de la bibliothèque standard : certaines surcharges ont été ajoutées à C++11. après Visual C++ 2010 a été publié.

1 votes

Le rapport de défaut 1261 s'est produit en 2009 ; je pense qu'il est raisonnable de reprocher à Microsoft une petit pour avoir avancé lentement, au moins.

0 votes

@Zack : VC++ 2010 a été écrit contre N3000, qui ne possède que les trois surcharges mentionnées.

11voto

Zack Points 44583

Vous avez trébuché sur C++ DR 1261 qui se lit en partie comme suit

Le code " int i; to_string(i); " ne compile pas, car ' int est ambiguë entre long long et long long unsigned '. Il semble déraisonnable d'attendre des utilisateurs qu'ils coulent des nombres jusqu'à un plus grand type de caractères juste pour utiliser to_string .

La résolution proposée est d'ajouter plus de surcharges. Le CCG l'a déjà mis en œuvre ; je suppose que MSVC ne l'a pas fait.

4 votes

La résolution a été incorporée dans la version finale de la norme C++11. La version bêta de Visual C++ 11 inclut toutes les surcharges.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X