C++ 模板和带有方法指针的继承

标签 c++ templates inheritance function-pointers member-pointers

如果我声明:

class Avoidance : public Schema<std_msgs::String,prog1::Command>{

我尝试着

    void*(Schema<std_msgs::String,prog1::Command>::*pt)();
    pt=&Avoidance::frontBusy;

编译器报告我

error: cannot convert ‘void* (Avoidance::*)()’ 
to 
‘void* (Schema<std_msgs::String_<std::allocator<void> >, prog1::Command_<std::allocator<void> > >::*)()’ in assignment
为什么?回避继承自

  Schema<std_msgs::String,prog1::Command>

然后回避 IS 模式<.....>

最佳答案

这不是成员函数指针的工作原理。如果frontBusy是基函数,则需要适本地键入指针。不过,调度仍将按预期工作!

这是一个基本示例:

struct A { virtual void f() = 0; };
struct B : A { virtual void f() { } };

void dispatch(void (A::*pf)(), A & a)
{            //    ^^^^^
  (a.*pf)();
}

int main()
{
  B x;
  dispatch(&A::f, x);  // calls x.B::f()
}  //      ^^^^^

所以,根据您的情况,您想要:

void (Schema<std_msgs::String,prog1::Command>::*p)()
                        = &Schema<std_msgs::String,prog1::Command>::frontBusy;

关于C++ 模板和带有方法指针的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14401761/

相关文章:

c++ - const char * 和 const char (& p)[T_Size] 之间的最佳查找匹配

c++ - C++ 标准中 14.8.2 第 3 段和第 4 段的含义是什么?

Javascript 继承 : How prototype chain works between native prototypes

C++ ifstream 和 ofstream 重载运算符从文件读取

使用索引信息的 C++partition_point

c++ - 自 C++17 允许显式指定某些类模板参数以来,构造函数的模板参数推导是否可用?

Javascript 参数和函数的继承

java - 如何避免多重继承?

c++ - 在展开堆栈之前获取回溯

c++ - Vera++ 规则实现