2016-04-25 1 views
-1

は、いくつかのコードを検討していますは、オペレータを作る方法を明示的にパラメータC++

void foo() { } 
bool bar() { return true; } 

struct S 
{ 
    void operator=(std::function<void()> f){f();}; 
    void operator=(std::function<bool()> f){f();};  
}; 

int main() { 
    S s; 
    s = foo; // ok 
    s = bar; // error: use of overloaded operator '=' is ambiguous 
}  

私はこの例を明確にできますか?そうstd::function<void()>std::function<bool()>両方がbool(*)()から構築することができる -

+0

が、どのように 'Sの=ブール値は、()' '演算子='の 'void'バージョンと一致していますか?そして、私は 'S = void()'と 'S = bool()'と仮定します。 s = foo; 'と' S s; s = bar; '、そう? –

+0

これを[mcve]にして、取得しているエラーメッセージを含めることはできますか? – NathanOliver

+0

@RemyLebeau、それは 'std :: function'がタイプ消去を行うためです – WhiZTiM

答えて

2

あなたに実行している問題はstd::function<void(Args...)>は、戻り値の型を破棄するように許可されていることです。後者はbarからの返信を転送しますが、前者はそれを破棄します。これは完全に有効な動作ですが、これをあいまいにします。

あなたはおそらくしたいことは完全にstd::functionを避けるためです:たぶん私は何かが欠けています

template <class F> 
void operator=(F f) { f(); } 
+0

のあいまいなオーバーロード各関数を別のものに戻したいのですが?明示的なテンプレートの特殊化は私の解決策ですが、私はプレーンな関数ポインタを正しく使用する必要がありますか? – Julian

+0

@Julianそれはあなたが実際にやりたいことに完全に依存します。 – Barry

関連する問題