Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从模板调用受类保护的方法_C++_Templates_Protected - Fatal编程技术网

C++ 从模板调用受类保护的方法

C++ 从模板调用受类保护的方法,c++,templates,protected,C++,Templates,Protected,我想有一个模板,可以访问它的typename参数的受保护方法。我怎样才能做到这一点 例如: class Foo{ ... protected: int Bar(); } template <class T> FooTempl{ ... int SomeMethod(T* ptr) { return ptr->Bar();}; ... } class-Foo{ ... 受保护的: int-Bar(); } 模板脚模板{ ... ints

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

例如:

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

template <class T> FooTempl{
   ...
   int SomeMethod(T* ptr) { return ptr->Bar();};
   ...
}
class-Foo{
...
受保护的:
int-Bar();
}
模板脚模板{
...
intsomethod(T*ptr){return ptr->Bar();};
...
}

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

Foo
中添加以下行:

template<typename T> friend class FooTempl;
模板朋友类footemp;

Foo
中添加以下行:

template<typename T> friend class FooTempl;
模板朋友类footemp;

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();
}
class-Foo
{
受保护的:
int Bar(){return 42;}
};
模板
等级:公共T
{
公众:
int somethod(){return T::Bar();}
};
int main()
{
脚柱杆;
bar.SomeMethod();
}

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

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();
}
class-Foo
{
受保护的:
int Bar(){return 42;}
};
模板
等级:公共T
{
公众:
int somethod(){return T::Bar();}
};
int main()
{
脚柱杆;
bar.SomeMethod();
}

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

除了访问级别之外,它应该是
ptr->Bar()
,而不是
T->Bar()
为什么您不能将friend直接添加到
Foo
body?@tyz您的意思是什么?如何
friend
a模板?这就是问题的关键所在:-)除了访问级别之外,它应该是
ptr->Bar()
,而不是
T->Bar()
为什么不能直接将好友添加到
Foo
body?@tyz你是什么意思?如何
friend
a模板?这就是问题的关键所在:-)我不知道我以前试过的时候做错了什么,但它似乎起作用了……我不知道我以前试过的时候做错了什么,但它似乎起作用了。。。。