2011-08-09 16 views
0

typenameパラメータの保護されたメソッドにアクセスできるテンプレートが必要です。どのように私はその仕事をすることができますか?例えばテンプレートからクラス保護されたメソッドを呼び出す

class Foo{ 
    ... 
    protected: 
    int Bar(); 
} 

template <class T> FooTempl{ 
    ... 
    int SomeMethod(T* ptr) { return ptr->Bar();}; 
    ... 
} 

理由はなく、他の外部の呼び出し元に、私はこの方法Foo::Bar()がテンプレートにアクセスできるようにするということです。かつての派生を持っているだろうFooの友人としてFooTemplを宣言するに

template<typename T> friend class FooTempl; 
+0

アクセスレベルの横には、 'T-> Bar()'ではなく、 'ptr-> Bar()'にする必要があります。 – Nawaz

+0

確かに、誤植...ありがとう – littleadv

+0

なぜFooに直接友達を追加できませんか?体? –

答えて

2

Fooに次の行を追加...それを動作させることができますが、いくつかのfriend構文があります願っています後者から。この場合、FooFooTemplの基本クラスなので、FooTempl::SomeMethodにはもうFoo *パラメータは必要ありません。

class Foo 
{ 
    protected: 
    int Bar() { return 42; } 
}; 

template <class T> 
class FooTempl : public T 
{ 
public: 
    int SomeMethod() { return T::Bar();} 
}; 

int main() 
{ 
    FooTempl<Foo> bar; 

    bar.SomeMethod(); 
} 

どちらの方が適切かは、使用するケースによって異なります。

+0

私は前にそれを試したときに私が間違っていたか分からないが、それは働いているようだ.... – littleadv

関連する問題