gpt4 book ai didi

c++ - 模板类继承的子类定义错误

转载 作者:行者123 更新时间:2023-11-30 03:14:58 25 4
gpt4 key购买 nike

我正在定义可以将函数作为模板参数的类 A。类 B 继承类 A。但是,存在错误 B: use of class template requires template argument list 和其他多个错误。我在想 B 类的声明出错了。但是,我没有为类 B 使用任何模板。有人可以评论吗?

#include <iostream>

void f_global()
{
std::cout << "top level function\n";
}

template<typename F>
class A
{
public:
F f1;
A(F fun1) : f1(fun1) {}
void fa();
};

template<typename F>
void A<F> :: fa()
{
std::cout << "From A<F>::fa()\n";
f1();
}

template<typename F>
class B : public A<F> //error
{
public:
void fb();
};

void B::fb() //error
{
std::cout << "From B::fb()\n";
A::f1(); //Can access f1()?
}
int main()
{
A obja(f_global); //error?
obja.fa();
B objb;
objb.fb();
}

最佳答案

首先,解释您要实现的目标通常很有用。这里有很多非常聪明的人,他们会想出与您的问题完全无关的解决方案。

现在,我已经尝试猜测您想要实现的目标。因为你调用fa来自 fb , 我假设 Btemplate .如果没有,那么至少 fb应该是一个模板函数。但是,由于您没有将要执行的函数作为参数传递给 fb ,我终于猜到了你的class B旨在成为 template .

所以,你的全局函数没问题:

void f_global()
{
std::cout << "top level function\n\n";
}

你的 class A没关系,但为了清楚起见,我会使用 F对于函数类型和 F*对于函数指针 (*),我还将存储 function作为 private成员。但是,为了尊重您问题中的代码,我将其保留为 public。成员(member)。

编辑 (*)正如@Phil1970 指出的那样,FF* 更通用因为它可以与 lambdas 和 std::function 一起使用.

template <typename F>
class A
{
public:
A(F fun) : _f {fun} {}
void fa() { std::cout << "From A<F>::fa()\n"; _f(); }
F _f;
};

如您所想,您的 class B 有问题.首先,如果template <typename F> B继承自 template <typename F> A , 你应该能够构造一个 A<F> 类型的对象来自 B<F> 的构造函数中.换句话说,B<F>应该能够构建A<F> ,因此,您应该传递函数 f_globalclass B<F> 的构造函数.

template <typename F>
class B : public A<F>
{
public:
B(F* fun) : A<F>(fun) {}
void fb() { std::cout << "From B::fb()\n"; A<F>::_f(); }
void fb1() { std::cout << "From B::fb1()\n"; this->template _f(); }
using A<F>::_f;
void fb2() { std::cout << "From B::fb2()\n"; _f(); }
};

我添加了函数 fb1fb2向您展示如何调用可调用对象 _f成员使用模板推导并使用关键字 using .

关于c++ - 模板类继承的子类定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57376648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com