2011-08-09 75 views
0

我想要一个可以访问其typename参数的受保护方法的模板。我怎样才能做到这一点?从模板调用类保护方法

例如:

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

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

的原因是我想要的方法Foo::Bar()要到模板访问,但没有任何其他外部调用者。我希望有一些friend语法有可以使它的工作...

+0

除访问级外,应该是'ptr-> Bar()',而不是'T-> Bar()' – Nawaz

+0

当然,错字...感谢 – littleadv

+0

为什么你不能直接给朋友添加'Foo'身体? –

回答

2

添加以下行Foo

template<typename T> friend class FooTempl; 
+0

我不知道我以前做过什么,但它似乎在工作.... – littleadv

2

来声明FooTempl作为Foo朋友的另一种办法是有前派生从后者。在这种情况下,因为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(); 
} 

哪种方法更合适取决于您的用例。