#include <iostream>

template <int N>
class X {
public:
  using I = int;
  void f(I i) {
    std::cout << "i: " << i << std::endl;
  }
};

template <int N>
void fppm(void (X<N>::*p)(typename X<N>::I)) {
  p(0);
}

int main() {
  fppm(&X<33>::f);
  return 0;
}


我只是不了解代码的编译错误消息。

error: called object type 'void (X<33>::*)(typename X<33>::I)' is not a function or function pointer
 p(0);


我认为p是一个返回void并以int作为参数的函数。但显然不是。有人可以给我提示吗?

最佳答案

由于p是指向非静态成员函数的指针,因此需要一个实例来调用它。因此,首先在main中实例化X<33>的对象:

int main() {
  X<33> x;
  fppm(x, &X<33>::f); // <-- Signature changed below to accept an instance


然后在函数中,更改代码以接受X<N>的实例并为其调用成员函数:

template <int N>
void fppm(X<N> instance, void (X<N>::*p)(typename X<N>::I)) {
  (instance.*p)(0);
}


语法看起来很丑陋,但是指向成员运算符的指针的优先级较低,因此需要括号。

关于c++ - 关于C++上模板推导的编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49277214/

10-09 13:32