2017-07-04 5 views
3

このプログラム考えてみましょう:fooがFoo<double>としてインスタンス化されている場合、上記で参考とconstの

template<typename T> 
struct Foo 
{ 
    void foo(const T&) {} 
    void foo(T&) {} 
}; 


int main() 
{ 
    Foo<double&> f; 
    double d = 3.14; 
    f.foo(d); //complains that foo() is ambigous 
} 

を、その後、物事は罰金ですが、それはFoo<double&>としてインスタンス化される場合は、fooへの呼び出しがあいまいになります。 fooのパラメータタイプを推測するときにrefがここで崩壊しているのですか?もしそうならconstanceはなぜ無視されますか?テンプレートパラメータdouble&

template<typename T> 
struct Foo { 
    void foo(T const&) {} 
    void foo(T&) {} 
}; 

+0

あなたが無視されて 'const'nessで何を意味するのですか?その「const」をどこで使っていますか? – Elyasin

+0

[OK]を、私はここで答えを見つけた - https://stackoverflow.com/a/27728034/150365 –

+0

@bolovは重複は関係していないようです。この場合、OPはクラステンプレートではなく関数テンプレートを参照するためです。 – 101010

答えて

3

たちはFooクラステンプレートをinstatiateしようとすると何が起こるか見てみましょう。 double&とTを代入すると、あなたが得るだろうルール崩壊参照に従って:

struct Foo { 
    void foo(double& const) {} 
    void foo(double&) {} 
}; 

を参照がdouble& constdouble&に相当し、本質的に一定であるので、を。このように、あなたは以下のinstatiation取得:

struct Foo { 
    void foo(double&) {} 
    void foo(double&) {} 
}; 

をここで「あなたは同じシグネチャを持つfooをオーバーロードすることはできませんデュード」を叫んでコンパイラが付属しています。

よりconsiseエラーがCLANGで与えられます。

error: multiple overloads of 'foo' instantiate to the same signature 'void (double &&)' void foo(T&) { }

Live Demo

+1

'double&'ではなく、 'double &&' – Barry