2017-01-04 93 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 convertedstd::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或非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的兩個參數必須是相同的類型。