0

投稿に基づくC++ でその名前 (std::string) で関数を呼び出す方法は? 、CLASSを使用してバージョンを作成しようとしましたが、私のアプローチは機能しません。

class A {
    public:
        int add(int i, int j) { return i+j; }
        int sub(int i, int j) { return i-j; }
};

typedef int (*FnPtr)(int, int);

int main(int argc, char* argv[]) {

// initialization:
std::map<std::string, FnPtr> myMap;
A a;
myMap["add"] = a.add;
myMap["sub"] = a.sub;

次のエラーを返します。

main.cpp:31:22: error: cannot convert ‘A::add’ from type ‘int (A::)(int, int)’ to type ‘std::map<std::basic_string<char>, int (*)(int, int)>::mapped_type {aka int (*)(int, int)}’
main.cpp:32:22: error: cannot convert ‘A::sub’ from type ‘int (A::)(int, int)’ to type ‘std::map<std::basic_string<char>, int (*)(int, int)>::mapped_type {aka int (*)(int, int)}’

誰がエラーが何であるか知っていますか?

4

2 に答える 2

2

少なくともあなたが物事を示したように、あなたclass Aは問題しか提供しません。これを名前空間にすると、作業がずっと簡単になります。

namespace A {
    int add(int i, int j) { return i+j; }
    int sub(int i, int j) { return i-j; }
};

typedef int (*FnPtr)(int, int);

int main(int argc, char* argv[]) {
    std::map<std::string, FnPtr> myMap;
    myMap["add"] = A::add;
    myMap["sub"] = A::sub;
    // ...

このように、メンバー関数addsubはないため、型の不一致は発生しません。少なくとも示されているように、 のインスタンスはとAを呼び出す以上の機能を提供していないため、名前空間は問題を排除しながら、同様に多くのことを達成します。addsub

于 2013-10-20T17:11:47.053 に答える