2009-05-20 25 views
7

Bir liste sınıf için üye sınıf olarak bir yineleyici sınıfı oluşturmak için çalışıyorum ve indirection operatörü (*) bu işaret ediyor listesine erişmek için aşırı çalışıyorum:İndirme operatörü nasıl yüklenir? (C++)

template<class T> 
T list<T>::iterator::operator*(iterator& iter) 
{ 
    return ((iter.lstptr)->current)->data; 
} 

Burada lstptr bir listenin bir işaretçisidir, current bir node sınıfının bir işaretçisidir ve düğüm sınıfıtip T tipini içerir.

Yineleyici böyle ilan edilir:

list<int> lst1; 
lst1.add(6); 
list<int>::iterator IT; 
IT = lst1; 
//everything above this point compiles fine 
int a = *IT; //error here (line fourteen) 

hatası: İyiyim aşırı operatörün işlevi tanımı * derlemek, ama am güçlü

template<class T> 
class list 
{ 
public: 
class iterator; 
}; 

template<class T> 
class list<T>::iterator 
{ 
//stuff 
}; 

ben böyle bir şey yapmak çalıştığınızda Ben < 1> yasadışı bir dolaylı kullanıyorum ve < 2> listeden dönüştüremediğini söylerim: iterator to int. Her iki hata da on dört satırda gerçekleşir.

Neyi yanlış yaptığımı ve dolaylı operatörü doğru şekilde nasıl yükleyebileceğimi bilen var mı?

NB: Daha fazla kod görmeniz gerekiyorsa, bana hangi bölümü söyleyin, çünkü tüm kodu buraya koymak istemiyorum çünkü 205 satır abot ve bu satırların 204'ü (sanırım) yok herhangi bir hata var.

+0

"Liste :: iterator IT;" yazdınız mı? - "Liste :: iterator IT;", değil mi? – leander

+0

@leander: Evet, gerçek koddaki liste , ben sadece kendi örneğimde yazarak karıştırdım. –

cevap

12

Çarpma işlecini aşırı yüklediniz. Bir dolaylı kullanıcı yapmak için parametreyi dışarı çıkarın.

template<class T> 
T list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 

Ayrıca derlemek için *IT = 3; gibi kod istiyorsanız başvuru döndürmek olmalıdır.

template<class T> 
T& list<T>::iterator::operator*() 
{ 
    return ((this->lstptr)->current)->data; 
} 
+1

Çarpıcı operatör değil! Ama referans döndürme konusunda haklısınız. – Zifre

+4

Operatörü *, dolaylı operatör olarak serbest fonksiyon olarak yazmalıdır. OP tarafından yazıldığı gibi, çarpma operatörüdür.Ben aslında gözardı ettim, görünüşe göre bir üye olarak ilan edildiği gerçeğini görmezden geliyor :) –

+0

bu yüzden "& ((thisst> lstptr) -> current) -> data"? –

5

Burada iki probleminiz var; Birincisi, çarpma operatörüne kazara aşırı yüklenme yaptığınız; İkincisi, bir referans tipi göndermediniz.

İlk sayı, parametre sayısının sonucu olarak ortaya çıkar. Bir sınıfın statik olmayan üye işlevlerinin her biri ek bir "gizli" parametresine sahiptir: this. this, elbette, işlevin çağrılmakta olduğu nesnenin işaretçisidir. Sonuç olarak, aslında iki parametre alan operatörün bir sürümünü bildirdiniz. İkinci yineleyici parametresini kaldırarak ve this'da çalışarak, tekli olmayan *'u aşırı yüklemeyeceksiniz.

İkinci sorun, dönüş türünün küçük bir tanesidir; Orijinal nesneye değil, orijinal nesnesine bir kopya döndürüyorsunuz. Referans döndürmek için dönüş türünü T& olarak bildirin.

+0

+1. Geri dönüş türü ile ilgili olarak, * temel alınan türün küçük bir değer türü olması ve atanabilir olması istenmiyorsa OP'nin yaptığı gibi bir kopyanın döndürülmesi tercih edilebilir - ancak bu olağandışı bir durum olacaktır. Coppro'nun önerdiği gibi ref tercih et. –