Вызов метода, защищенного классом, из шаблона - PullRequest
1 голос
/ 09 августа 2011

Я хочу иметь шаблон, который может получить доступ к защищенному методу его параметра typename.Как я могу заставить это работать?

Например:

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

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

Причина в том, что я хочу, чтобы метод Foo::Bar() был доступен для шаблона, но не для любого другого внешнего абонента,Я надеюсь, что есть некоторый синтаксис friend, который может заставить его работать ...

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Альтернативой объявлению 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();
}

Какой из этих методов более подходит, зависит от вашего варианта использования.

2 голосов
/ 09 августа 2011

Добавьте следующую строку в Foo:

template<typename T> friend class FooTempl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...