2014-06-06 10 views
5

Ben :: iterator_facade boost keşfetmek ve bu kod bit rastladı mı? Arkadaşlık sınıflarına aşinayım, ama daha önce hiçbir şeyden önce template <class>'u gördüğümü sanmıyorum. Sadece Iterator demektirŞablon <class> Foo` nun arkadaş sınıfı nedir? İkinci satır ne demektir</p> <pre><code>friend class boost::iterator_core_access; template <class> friend class Iterator; </code></pre> <p>:

template <class Value> 
class node_iter 
    : public boost::iterator_facade< 
     node_iter<Value> 
     , Value 
     , boost::forward_traversal_tag 
    > 
{ 
public: 
    node_iter() 
     : m_node(0) {} 

    explicit node_iter(Value* p) 
     : m_node(p) {} 

    template <class OtherValue> 
    node_iter(node_iter<OtherValue> const& other) 
     : m_node(other.m_node) {} 

private: 
    friend class boost::iterator_core_access; 
    template <class> friend class node_iter; 

    template <class OtherValue> 
    bool equal(node_iter<OtherValue> const& other) const 
    { 
     return this->m_node == other.m_node; 
    } 

    void increment() 
    { m_node = m_node->next(); } 

    Value& dereference() const 
    { return *m_node; } 

    Value* m_node; 
}; 
typedef impl::node_iterator<node_base> node_iterator; 
typedef impl::node_iterator<node_base const> node_const_iterator; 
+1

http://en.cppreference.com/w/cpp/language/friend – chris

+0

'class node_iter' burada kendisinin bir arkadaşıdır.Bu satır gibi görünüyor belki bir sınıf bir sınıf kendisi için varsayılan olarak –

cevap

5

bir şablon parametresi olan bir şablon sınıftır:


İşte bağlam var. Arkadaşlık, Iterator tüm örneklemelerine verilir.

Iterator<int> sınıfın bir arkadaşıdır.

Iterator<bool> sınıfın bir arkadaşıdır.

...

Iterator<MyClass> sınıfın bir arkadaşıdır.

Bu fikri anladınız.

Örnek Kullanım bir sınıf şablonu Foo olduğunu varsayalım. Derleme zamanında iki sınıfları oluştururken

Foo<int> a; 
Foo<float> b; 

:

template <typename T> class Foo 
{ 
    public: 
     Foo() : data(0) {} 
    prvavte: 
     T data; 
}; 

kullandığınız sınıf şablonu örneğini zaman. Foo<int>, Foo<float>'un özel bölümüne erişemez ve bunun tersi de geçerlidir. Bu bir miktar rahatsızlıktır.

Sen yapamaz: sınıfa bir atama operatörü eklendi bile

b = a; // If you wanted to pull the data from a and put it in b. 

,

template <typename T> class Foo 
{ 
    public: 
     Foo() : data(0) {} 
     template <typename T2> Foo& operator=(Foo<T2> const& rhs) 
     { 
     this->data = rhs.data; 
     return *this; 
     } 

    private: 
     T data; 
}; 

Foo<T> özel erişimi yoktur, çünkü işe yaramaz Foo<T2> bölümleri. Etrafında dolaşmak için bir arkadaş beyanı kullanabilirsiniz.

template <typename T> class Foo 
{ 
    public: 
     template <class> friend class Foo; 
     Foo() : data(0) {} 
     template <typename T2> Foo& operator=(Foo<T2> const& rhs) 
     { 
     this->data = rhs.data; 
     return *this; 
     } 

    private: 
     T data; 
}; 

Şimdi, kullanabilirsiniz:

Foo<int> a; 
Foo<float> b; 
b = a; 
+0

Ah, sanırım eksik olan bölüm temelde 'şablon 'adsız bir şablon parametresi içerir. Sanırım bu nadiren ortaya çıkıyor. – vmrob