2009-10-13 18 views
5

Std :: set etrafında şablon sarıcı yapıyorum. Begin() işlev bildirimi için neden hata alıyorum?hata döndürüyor std :: set <T> :: yineleme şablonunda

template <class T> 
class CSafeSet 
{ 
    public: 
     CSafeSet(); 
     ~CSafeSet(); 

     std::set<T>::iterator Begin(); 

    private: 
     std::set<T> _Set; 
}; 

hatası: tip 'std :: seti, std :: allocator < _CharT>>' 'CSafeSet'

+3

Yan not olarak: Bunu tanımlayıcılarda alt çizgi kullanma hakkında okuyun. http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+1

Kısa versiyon: "Tanımlayıcı adlarını altçizgi ile başlatmayın " – jalf

+0

Uzun versiyon: Derleyici için büyük harfle takip edilen alt harfler ayrılmıştır. Derleyici için her şeyi takip eden çift alt çizgiler de ayrılmıştır. – GManNickG

cevap

17

türünden türetilmiş değildir typename deneyin:

template <class T> 
class CSafeSet 
{ 
    public: 
     CSafeSet(); 
     ~CSafeSet(); 

     typename std::set<T>::iterator Begin(); 

    private: 
     std::set<T> _Set; 
}; 

Sen TypeName gerek Orada, şablon T'ye bağımlı olduğu için kodun üzerindeki bağlantıda daha fazla bilgi. Yan not

template <class T> 
class CSafeSet 
{ 
    public: 
     typedef T value_type; 
     typedef std::set<value_type> container_type; 
     typedef typename container_type::iterator iterator_type; 
     typedef typename container_type::const_iterator const_iterator_type; 

     CSafeSet(); 
     ~CSafeSet(); 

     iterator_type Begin(); 

    private: 
     container_type _Set; 
}; 

Eğer CSafeSet özel comparer kullanarak anlamına gelen bir set could olarak aynı şeyi yapmak için izin gerekir tamamlamak olmak istiyorsanız,: Eğer typedef en kullanırsanız Çok 'Bu eşyaların daha kolay yapılır ve ayırıcı: bir sınıfın etrafında sarıcı oluşturmak için gidiyoruz eğer

template <class T, class Compare = std::less<T>, class Allocator = std::allocator<T> > 
class CSafeSet 
{ 
    public: 
     typedef T value_type; 
     typedef Compare compare_type; 
     typedef Allocator allocator_type; 

     typedef std::set<value_type, compare_type, allocator_type> container_type; 
     typedef typename container_type::iterator iterator_type; 
     typedef typename container_type::const_iterator const_iterator_type; 

     // ... 
} 

ve bir tavsiye son bit, sınıf nereden geldiğini aynı adlandırma kuralları takip etmeye çalışıyorum. Yani, Begin(), muhtemelen begin() olmalıdır (Ve kişisel olarak bir sınıf adı garip ama ben size kalmış biri önce C düşünüyorum:))

+1

CSafeSet sınıfı şablonunuzda bir hata olduğuna dikkat edin. Ayrıca, bağımlı oldukları için yineleyici türlerini tanımlamak için typename'e de ihtiyacınız vardır. Örnek: typedef ** typename ** container_type :: iterator iterator_type; Bu tip ad olmadan, standart bir uyumlu bir derleyicide derlememelidir. Visual Studio'da (2008'den önceki sürümde, sabit olduğunu düşündüğümde) denediğinizi tahmin edebilirim; –

+0

Aslında hiç denemedim. Bunu işaret ettiğin için teşekkürler, aptalca davranıyordum (çok yaygın) :) – GManNickG

+0

Çok teşekkürler, GMan. – jackhab

İlgili konular