使用指向B类函数

时间:2017-09-29 10:47:47

标签: c++ c++11

我在A类(A.hpp)中有两个静态std :: map声明为static:

typedef bool (*fct_pointer_t)(uint8 *msg, void *other);
typedef std::map<std::string, fct_pointer_t> map_string_to_fct_t;
typedef std::map<fct_pointer_t, std::string> map_fct_to_string_t;
class A {
     static map_string_to_fct_t str_to_fct;
     static map_fct_to_string_t fct_to_str;
}

我需要从A初始化这两个静态std :: map,并指向B类函数。这是在B.cpp文件中完成的:

map_string_to_fct_t A::str_to_fct = {
    {"string1", &B::fct1},
    {"string2", &B::fct2},
}
map_fct_to_t A::fct_to_str = {
    {&B::fct1, "string1"},
    {&B::fct2, "string2"},
}
B::fct1(uint8* msg, void*){
...
}
B::fct2(uint8* msg, void*){
...
}

为了让静态成员能够访问B的成员函数,我在B.hpp文件中声明B的朋友如下:

class B {
    friend class A;
    fct1(...);
    fct2(...);
}

现在,为什么我在编译时遇到这个错误?

error: could not convert [...] from '<brace-enclosed initializer list>' to 'map_string_to_fct_t {aka std::map<std::basic_string<char>, bool (*)(uint8*, void*)>}

感谢您的帮助。

编辑:工作,因为成员职能是静态的

我做的另一个测试是将fct1和fct2作为静态成员函数放在A类中。它奏效了。所以B级不再存在了:

A.hpp

typedef bool (*fct_pointer_t)(uint8 *msg, void *other);
typedef std::map<std::string, fct_pointer_t> map_string_to_fct_t;
class A {
     static map_string_to_fct_t str_to_fct;
     static fct1(...);
     static fct2(...);
}

A.cpp

map_string_to_fct_t A::str_to_fct = {
     {"string1", &A::fct1},
     {"string2", &A::fct2},
}
A::fct1(uint8* msg, void*){
...
}
A::fct2(uint8* msg, void*){
...
}

0 个答案:

没有答案