gpt4 book ai didi

c++ - typedef函数指针继承

转载 作者:行者123 更新时间:2023-11-30 01:31:13 28 4
gpt4 key购买 nike

我可以在这样的类中有一个 typedef 函数指针:

template<typename T>
class MyClass
{

public:

typedef T (*fptr)(T);

void doSomething(fptr my_fptr) { /*...*/ }

};

这很好用。但是如果我继承自这样一个类,如下所示:

template<typename T>
class MyClass
{

public:

typedef T (*fptr)(T);

virtual void doSomething(fptr my_fptr) = 0;

};

template<typename T>
class MyOtherClass: public MyClass<T>
{

public:

void doSomething(fptr my_fptr) { /*...*/ }

};

编译器提示 fptr 未定义。有没有办法像这样继承函数指针类型定义?谢谢,詹姆斯

最佳答案

问题不在于继承,而在于一个模板继承自另一个模板的实例化,并将其自己的模板参数作为参数传递。也就是说,它继承自依赖类型( MyClass<T> 依赖于类型 T )。

该语言要求在执行类型替换之前验证模板,并且在第一次传递期间,验证所有非依赖名称。当编译器看到 fptr它不依赖于类型 T ,因此它会尝试将其作为命名空间级别符号定位在模板之外,但失败了。不允许实例化 MyBase与类型(没有用于替换的类型)因此整个 MyBase是一个未知数,无法在那里查找任何符号(如果不替换类型,编译器无法知道是否存在 MyBase 的特定特化)。

最简单的解决方案是添加本地 typedef:

typedef MyBase<T> base_type;
typedef typename base_type::fptr fptr;

或完全限定调用:

void doSomething( typename MyClass<T>::fptr ) ...

关于c++ - typedef函数指针继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469021/

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