2017-01-04 5 views
1
#include <iostream> 
#include <string> 

int main() { 
    using std::string; 
    using std::distance; 
    using std::cout; 
    using std::endl; 

    string s("abc"); 
    string::const_iterator b = s.begin(); 
    string::const_iterator e = s.end(); // success 
    cout << distance(b, e) << endl; 
    cout << distance(b, static_cast<string::const_iterator>(s.end())) << endl; 
    cout << distance(b, s.end()) << endl; // error 
    return 0; 
} 

Fin de la chaîne s.end() peut être implicitly converted-std::string::const_iterator comme e, mais quand il est passé comme paramètre de fonction, il doit être explicitement casted; sinon, une erreur est générée lors de la compilation. Pourquoi donc?conversion implicite échoue dans le paramètre de la fonction

FYI, s.begin() et s.end() semblent tous deux renvoyer std::string::iterator.

Une expression e est dit convertible implicitement T2 si et seulement si T2 peut être copier-initialisés de e, qui est la déclaration T2 t = e; est bien formée (peut être compilé), pour certains inventèrent t temporaire .

+0

Merci à vous deux. Réponses valides Mon mauvais ne pas essayer les méthodes non-modèle. –

Répondre

1

La fonction a un paramètre de modèle

template <class InputIterator> 
typename iterator_traits<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

Il ne peut pas déduire le type de paramètre de modèle, soit parce iterator const ou non-const peuvent être utilisés pour chaque paramètre de fonction.

Vous pouvez écrire sans jeter de la manière suivante

std::distance<std::string::const_iterator>(b, s.end()) 

spécifiant explicitement l'argument de modèle.

Un autre exemple. Cet extrait de code sera également pas compiler

long x = 0; 
int y = 0; 
std::min(x, y); 

Toutefois, si vous écrirez

long x = 0; 
int y = 0; 
std::min<long>(x, y); 

alors le code compile.

1

Les arguments de fonction de modèle ne sont pas convertis. Les deux arguments à std::distance doivent être du même type.