2012-04-11 15 views
8

私はstd ::関数でラップして渡したいオーバーロードされた関数を持っています。 GCC4.6は "マッチング関数"を見つけません。 私はここでいくつかの質問を見つけたが、回答は私が好きなほど明確ではない。誰かが、次のコードが正しい過負荷を差し引くことができず、(上品に)回避する方法を教えてもらえますか?std :: functionを使ってオーバーラップ関数をラップします。

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(); 
} 

答えて

17

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

として明示的なキャストを使用し、それを明確にする:今、コンパイラはキャストで型に基づいて状況を、明確にすることができるだろう

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はどのオブジェクトでも初期化できます。

+1

古いスタイルのキャストの代わりに 'static_cast'を使用してください。 – Anonymous

+0

@Anonymous:はい。しかし私はそれを短くしたかったのです。とにかく、私はそれをC++のように見せるために編集しました - ish! – Nawaz

+0

どのように皮肉なことですか?関数ポインタから離れるために導入されたstd ::関数を得るために関数ポインタを使用する必要があります:) thx – abergmeier

関連する問題