10

std::function にラップして渡したいオーバーロードされた関数があります。GCC4.6 は「一致する関数」を見つけられません。ここでいくつかの質問を見つけましたが、答えは私が望むほど明確ではありません. 次のコードが正しいオーバーロードを差し引くことができない理由と、それを (エレガントに) 回避する方法を誰か教えてもらえますか?

int test(const std::string&) {
    return 0;
}

int test(const std::string*) {
    return 0;
}

int main() {
    std::function<int(const std::string&)> func = test;
    return func();
}
4

1 に答える 1

21

それはあいまいな状況です。

曖昧さを解消するには、明示的なキャストを次のように使用します。

typedef int (*funtype)(const std::string&);

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast!

これで、コンパイラーはキャストのタイプに基づいて状況を明確にすることができます。

または、これを行うことができます:

typedef int (*funtype)(const std::string&);

funtype fun = test; //no cast required now!
std::function<int(const std::string&)> func = fun; //no cast!

では、なぜ上記std::function<int(const std::string&)>のように機能しないfuntype fun = testのですか?

答えは、std::function任意のオブジェクトで初期化できるためです。コンストラクターはテンプレート化されており、渡したテンプレート引数とは無関係ですstd::function

于 2012-04-11T17:39:05.897 に答える