2011-07-28 16 views
0

私はテンプレート化されていないクラス(Par_list_elem)を持っており、その内部へのアクセスをクラスPar_listに与えたいと思います。スーパークラスのテンプレートフレンド

キャッチ:Par_list_elemとのすべてのサブクラスがPar_listにアクセスできる必要があります。詳細には、アクセス可能でなければならない唯一のフィールドは_nextと_prevです。明示的にそれらのフィールドに限定することはいいかもしれませんが、必須ではありません。

私はこれを行うことで、いくつかの予備的な試みを作った、最新のは、その下にある:

 template <class T> class Par_list { 
      public: 

        Par_list() : _head(0) {} 
        ~Par_list(); 

        //Insert element into list 
        bool insert(T elem); 


        //Remove element identified by iterator 
        void erase(iterator itr); 

      private: 
        T* _head; 
    }; 


    class Par_list_elem { 
      public: 
        Par_list_elem() : _next(0), _prev(0) {} 
        //Get next element in list 
        Par_list_elem* next() { return _next; } 

      private: 
        Par_list_elem* _next; 
        Par_list_elem* _prev; 

        template <typename> friend class Par_list; 
    }; 




    template <class T> void Par_list<T>::erase(Par_list<T>::iterator itr) { 

     T* e = *itr; 

     T* p; 
     if ((p = e->_prev) != 0) 
       p->_next = e->_next; 
     else 
       _head = e->_next; 

     if ((e->_next) != 0) 
       (e->_next)->_prev = p; 

     delete e; 
    } 

    template <class T> bool Par_list<T>::insert(T* nelem) { 

     T* curr = _head; 
     if (curr != 0) { 
       while (curr->_next != 0) 
         curr = curr->next(); 
       curr->_next = nelem; 
     } else 
       _head = nelem; 

     nelem->_prev = curr; 
     nelem->_next = 0; 

     return true; 
} 

TEST.CPP

#include "parsnip_list_back.h" 

class elem : parsnip::Par_list_elem { 
    int _elem; 
}; 

int main (int argc, char** argv) { 

    parsnip::Par_list<elem> plist; 

    return 0; 
} 

一部の情報はここで入手可能であるように思わ: Template friend しかし、目標は私が立ち往生しているのとは細かく異なっています。

ありがとうございます!

-------- UPDATE ---------

エラーの次のソートはPar_list_elemのプライベートメンバのアクセスのインスタンスごとに発生します。私はgcc 4.4でコンパイルしています。

parsnip_list_back.h:66: error: ‘parsnip::Par_list_elem* parsnip::Par_list_elem::_prev’ is private 
parsnip_list_back.h:124: error: within this context 

したがって、現在の実装では、スーパークラスであってもその秘密情報を諦めていません。

+0

これは実際には意味がありません。あなたは "すべてのサブクラス"にアクセスする必要があると言いますが、基本クラスで定義されたフィールドにアクセスする必要があります。これはコード内の 'friend'宣言とまったく同じです。何が問題なのですか? –

+0

Par_classはPar_list_elemのサブクラスの_nextおよび_prevフィールドにアクセスできません。それは理にかなっていますか? – bcr

+0

サブクラスではなく、 'friend'宣言を持つクラスのメンバーであり、試してみたときにそれができるはずです。どのコンパイラを使用していますか?あなたはどんなエラーを出していますか? 'Par_list_elem'のサブクラスの例と、これらのメンバーの1つにアクセスしようとする' Par_list'のコードを投稿できますか? –

答えて

1

は、からPar_list_elemに個人的に継承されています。したがって、Par_listは基本クラスのプライベートメンバーにアクセスできますが、基本クラス自体にはアクセスできません。

私はPar_listにアクセスできるようにPar_list_elemそのサブクラスのすべてのを必要とします。

可能であれば、これは問題を解決しますが、実行できません。友情は継承されません。

最も簡単な解決策は、一般に継承することです。

+0

これは、elemが公に継承しているため、Par_listは元のprivate _nextフィールドと_prevフィールドがサブクラスによって変更されないことを保証しているので、o.kです。 Par_listを使用するには?また、ありがとう!魅力のように働いた。 – bcr

+0

さて、私の最後のコメントは混乱しました。唯一の基底クラスメンバー(単純化のためにnext()を無視する)はprivateであるため、メンバのアクセシビリティは継承アクセス指定子によって変更されません。したがって、公開クラスのみが基本クラス自体にアクセスできますか?基本クラスの友人を救う唯一の方法は、基本クラス自体にアクセスすることです。 – bcr

関連する問題