0

C++ でメンバー関数へのポインターを使用したいのですが、うまくいきません。

ポインター宣言:

int (MY_NAMESPACE::Number::*parse_function)(string, int);

ポインタの割り当て:

parse_function = &MY_NAMESPACE::Number::parse_number;

この呼び出しは完全に機能します (itd はマップの要素への反復子です)。

printf("%s\t%p\n",itd->first.c_str(),itd->second.parse_function);

しかし、これは機能しません:

int ret = (itd->second.*parse_function)(str, pts);
$ error: 'parse_function' was not declared in this scope

そして、これはどちらも

int ret = (itd->second.*(MY_NAMESPACE::Number::parse_function))(str, pts);
$ [location of declaration]: error: invalid use of non-static data member 'MY_NAMESPACE::Number::parse_function'
$ [location of the call]: error: from this location

理由がわかりません...

事前にt​​hx!!

4

2 に答える 2

1
int (MY_NAMESPACE::Number::*parse_function)(string, int);

これは、parse_functionclass のメンバ関数へのポインタであることを示していますNumber

この呼び出しは完全に機能します (itd はマップの要素への反復子です)。

printf("%s\t%p\n",itd->first.c_str(),itd->second.parse_function);

このことから、これが何であれ、parse_functionが のメンバーであることがわかります。itd->second

この通話について

int ret = (itd->second.*parse_function)(str, pts);

またはこの呼び出し

int ret = (itd->second.*(MY_NAMESPACE::Number::parse_function))(str, pts);

成功するにitd->secondは、 type でなければなりませんが、Numberおそらくそうではありません。また、parse_function は、現在のスコープまたは外側のスコープ内の変数 (最初のケース) またはクラス Number の静的変数 (2 番目のケース) として定義する必要があります。

だからあなたはいくつかを必要としNumber、それに適用parse_functionします

Number num;
(num.*(itd->second.parse_function))(str, pts);

またはポインターを使用して

Number *pnum;
(pnum->*(itd->second.parse_function))(str, pts);

更新

は数値なので、このようにそのメンバーである をitd->second適用する必要がありますparse_function

int ret = (itd->second.*(itd->second.parse_function))(str, pts);
于 2012-11-30T09:41:25.737 に答える
0

関数へのポインタは次のように定義できます。type(*variable)() = &function; たとえば、次のようになります。

int(*func_ptr)();
func_ptr = &myFunction;

今朝あなたのコードに気付かないかもしれませんが、問題はそれparse_functionがポインターである可能性がありますが、あなたはそれを のように呼び出していますitd->second.*parse_function。でポインタが呼び出される->*ので、やってみてくださいitd->second->parse_function

何も修正できないかもしれませんが、あなたのコードに追いつくことができないようです。より多くの情報を投稿すると、2 行のコードからはわかりにくくなります。


これが実際のコードでどのように使用されるかの 1 つの例を次に示します。これは、ポインターとパラメーターのみfunc()を使用して呼び出します。cb()

int func()
{
    cout << "Hello" << endl;
    return 0;
}

void cb(int(*f)())
{
    f();
}

int main()
{
    int(*f)() = &func;
    cb(f);
    return 0;
}
于 2012-11-30T09:18:21.333 に答える