2013-06-25 99 views
6

我有這樣的兩個類型定義:STL迭代器的std ::距離()錯誤

typedef std::vector<int> Container; 
typedef std::vector<int>::const_iterator Iter; 

在我所考慮的問題,我在Container Input執行某些操作,在那之後,我想計算std::distance(Input.begin(),itTarget) ,其中itTargetIter類型。但是我得到這個編譯器錯誤no instance of function template "std::distance" matches the argument list,只有投射後,即std::distance(static_cast<Iter>(Input.begin()),itTarget)一切工作正常。

我想知道爲什麼?

+2

是因爲'begin()'沒有返回一個'const_iterator'? –

+0

但不知何故它應該能夠? http://www.cplusplus.com/reference/vector/vector/begin/ –

+1

這就是'const'和non-'const'重載的工作方式。只有'Input'是'const'-qualified將會調用'const'超載。此外,而不是鑄造迭代器,你可以調用指定模板類型:'std :: distance (Input.begin(),itTarget)' –

回答

8

std::distance是一個模板函數,它不能接受不同的參數。 您需要使用:

std::distance(Input.cbegin(),itTarget); 
        ^^ 

看到std::vector::cbegin鏈接

+1

第三次魅力:P –

+0

和cbegin()返回const迭代器? –

+0

@SimonRighley yup,查看更新後的鏈接 – billz

5

Input.begin()返回iterator,而不是const_iterator,和你的第二個參數是一個const_iterator,所以兩個參數基本上是不同類型的。如果您有權訪問C++ 11功能,則可以使用cbegin()

做的第二種方式: 每個迭代器是通過轉讓

std::vector<int> myVector(100); 
std::vector<int>::iterator it = myVector.begin(); 
std::vector<int>::const_iterator cit = it; 

轉換爲一個常量性如果你有收拾東西進函數調用,你可以使用一些魔法施放:

std::distance(((const Container*)&Input)->begin(), itTarget); 

如果Input爲const,則編譯器將被迫使用const()的begin版本,該版本將返回一個const_iterator。

+0

一個強制轉換與vector的迭代器一起工作,因爲它們通常只是'T *'和'const T *'的typedef。它可能不適用於類的迭代器。 – jrok

+0

Scratch,看起來像'iterator'總是應該可以轉換爲'const_iterator'。 – jrok

+0

敞篷車,是的。澆注料?我不會那麼肯定。更新了我的答案。 – Marius