2017-01-04 9 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; 
} 

Конец строки s.end() может быть implicitly converted к std::string::const_iterator, как e, но когда она передается в качестве параметра функции, она должна быть явно отлиты; в противном случае во время компиляции возникает ошибка. Почему это?неявное преобразование не может быть в параметре функции

FYI, s.begin() и s.end() оба, кажется, возвращают std::string::iterator.

Выражение e называется неявно конвертируются в T2 тогда и только тогда, когда T2 можно скопировать инициализируется из e, то есть декларация T2 t = e; хорошо сформированным (может быть скомпилирован), для некоторых изобретен временного t ,

+0

Спасибо вам. Действительные ответы. Мое плохое, не пробовав не шаблонные методы. –

ответ

1

Функция имеет один параметр шаблона

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

Поэтому он не может вывести тип параметра шаблона, поскольку либо итератор Const или Неконстантный может быть использован для каждого параметра функции.

Вы могли бы написать без литья следующим образом

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

явного указания аргумент шаблона.

Другой пример. Этот фрагмент кода также не будет компилировать

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

Однако, если вы будете писать

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

затем код компилируется.

1

Аргументы функции шаблона не преобразуются. Два аргумента std::distance должны быть одного типа.

 Смежные вопросы

  • Нет связанных вопросов^_^