我希望有一个模板可以访问它的typename参数的受保护方法。我怎样才能做到这一点?
例如:
class Foo{
...
protected:
int Bar();
}
template <class T> FooTempl{
...
int SomeMethod(T* ptr) { return ptr->Bar();};
...
}
原因是我希望模板可以访问方法Foo::Bar()
,但不能访问任何其他外部调用方。我希望那里有一些friend
语法可以使它工作......
答案 0 :(得分:2)
将以下行添加到Foo
:
template<typename T> friend class FooTempl;
答案 1 :(得分:2)
将FooTempl
声明为Foo
的朋友的替代方法是让前者来自后者。在这种情况下,由于Foo
是FooTempl
的基类,因此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();
}
哪种方法更合适取决于您的使用案例。