我无法从函数指针访问非静态成员函数,并且无法弄清楚我的语法问题。当尝试编译时如下所示,我收到"错误:fnc_ptr未在此范围内声明。"如果代码被修改为不访问该函数,它应该指向它编译并将打印出1为bar.fn_ptr。编译我用过:
g++ -std=c++11 -Wall example.cpp foo.cpp
拆分文件结构/命名空间只是为了模仿与原始问题相同的条件。
example.cpp
#include "foo.h"
#include <iostream>
int main(int argc, char* argv[]){
pizza::foo bar;
bar.fn_ptr = &pizza::foo::fnc_one;
std::cout << (bar.*fn_ptr)(1) << std::endl;
return 0;
}
Foo.cpp中
#include <cmath>
#include "foo.h"
namespace pizza{
double foo::fnc_one(double x){
return pow(x,3) - x + 2;
}
}
foo.h中
namespace pizza{
class foo{
public:
double (foo::*fn_ptr)(double);
double fnc_one(double);
foo(){
fn_ptr = 0;
}
};
}
答案 0 :(得分:3)
在引用作为该对象属性的bar.
时,您缺少fn_ptr
。将其更改为:
std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;
它有效。
我还建议您阅读有关此主题的常见问题解答:https://isocpp.org/wiki/faq/pointers-to-members
答案 1 :(得分:0)
我相信正确的语法是:
//std::cout << (bar.*fn_ptr)(1) << std::endl;
std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;