【发布时间】:2019-12-14 09:47:26
【问题描述】:
在下面的代码中,我想保持继承class B : public A<F>,但只想将globalFunction() 传递给A,并以A::f1() 和A::fa() 从B 访问。我该怎么做?
#include <iostream>
void globalFunction()
{ }
//passing function to class A from main()
template<typename F>
class A
{
public:
F f1;
A(F fun1) : f1(fun1) {}
void fa() { f1(); } ;
};
template<typename F>
class B : public A<F>
{
public:
B (F fun2) : A<F>(fun2) {}
void fb() ;
};
template<typename F>
void B<F>::fb() { A<F>::f1(); }
int main()
{
A obja(globalFunction);
obja.fa();
B objb(globalFunction);
objb.fb();
}
基本上我想避免将B 设为B<F>。继承A<F> 到B 是否使B 也成为模板B<F>?我没有在B 的任何地方使用模板参数F,它只是从A 继承并使用B 作为A<F>::f1()
用户会将函数globalFunction 传递给模板化参数,因此class B : public A<decltype(globalFunction)> 不能使用。
【问题讨论】:
-
只有当 B 不依赖于模板参数时,才能将其设为非模板。例如,
class B : public A<decltype(global_function)>。否则出于显而易见的原因,它必须是模板。 -
您正在使用
B中的模板参数F来指定它继承自的类A<F>以及构造函数参数的类型。 (它不继承自A;A不是一个类,它是一个类模板。) -
您从模板类继承,因此显然您依赖于基类模板实例化的参数/类型。没有办法摆脱它(也不应该有)。
-
@SergeyA 类定义用户无法访问,因此来自
class B : public A<decltype(global_function)>的global_function未知。还有其他选择吗? -
为什么
A是一个模板?