2013-06-25 23 views
6

Böyle iki typedefs yaşıyorum: Ben düşünün problemindeSTL yineleyiciler std :: mesafe() hatası

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

, ben Container Input bazı işlemleri gerçekleştirmek ve bundan sonra ben std::distance(Input.begin(),itTarget) hesaplamak istiyorum Burada itTarget, Iter türündendir. Ama ben bu derleyici no instance of function template "std::distance" matches the argument list ve sadece döküm sonra, yani, std::distance(static_cast<Iter>(Input.begin()),itTarget) her şey iyi çalışıyor.

Neden böyle olduğunu merak ediyorum?

+2

Çünkü 'begin()' bir const_iterator' döndürmüyor mu? –

+0

Ama bir şekilde olmalı? http://www.cplusplus.com/reference/vector/vector/begin/ –

+1

Bu, 'const' ve' 'const'' aşırı yüklerinin çalışma şeklidir. Sadece 'Input' 'const' -destekse,' const' aşırı yüklenir. Ayrıca, yineleyiciyi yayınlamak yerine, şablon türünü belirtebilirsiniz: std :: mesafe (Input.begin(), itTarget) ' –

cevap

8

std::distance bir şablon işlevi, farklı parametreleri kabul edemez.

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

std::vector::cbegin bağlantı

+1

3. kez çekicilik: P –

+0

ve cbegin() const yineleyici döndürür? –

+0

@SimonRighley yup, güncelleştirilmiş bağlantıya bakın – billz

5

Input.begin() yerine const_iterator bir iterator döndürür görebilmek ve ikinci argüman bir const_iterator, yani iki argüman temelde farklı tiptedir: Sen kullanmak gerekir. C++ 11 Özelliklerine erişiminiz varsa cbegin()'u kullanabilirsiniz.

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

bunu yapmanın ikinci yolu: Eğer bazı dökme sihirli kullanabilirsiniz çağrı fonksiyonu içine sığdırmayı varsa Her yineleyici atama

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

tarafından const_iterator çevrilebilir olan

Giriş yapılıyorsa, derleyici const_iterator öğesini döndüren begin() const sürümünü kullanmaya zorlanır.

+0

Bir döküm vektörün yineleyicileriyle çalışır çünkü onlar sadece T * 've' const T * için bir yazım hatasıdır. Sınıflar olan yineleyiciler ile çalışmayabilir. – jrok

+0

"Yineleyicinin" her zaman const_iterator öğesine dönüştürülebilir olması gerektiği gibi görünüyor. – jrok

+0

Dönüştürülebilir, evet. Döküm yapılabilir? Bu kadar emin olmazdım. Cevabımı güncelledi. – Marius