【问题标题】:Calling a class protected method from a template从模板调用类保护方法
【发布时间】:2011-10-22 20:15:45
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 除了访问级别,应该是ptr-&gt;Bar(),而不是T-&gt;Bar()
  • 为什么不能直接加好友到Foobody?
  • @tyz 你什么意思?我如何friend 一个模板?这就是问题的重点:-)

标签: c++ templates protected


【解决方案1】:

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();
}

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

【讨论】:

    【解决方案2】:

    将以下行添加到Foo

    template<typename T> friend class FooTempl;
    

    【讨论】:

    • 我不知道我之前尝试过的时候做错了什么,但它似乎正在工作......
    猜你喜欢
    • 2015-02-16
    • 2011-05-18
    • 2016-08-17
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多