2017-01-10 4 views
3

は、その後、私は呼んしようとしている...私は2つのオーバーロード、整数と整数への他の参照を受け入れるものを定義しています次のコードで参照受付機能

#include <stdio.h> 

void foo(int) { printf("foo(int)\n"); } 
void foo(int&) { printf("foo(int&)\n"); } 

をオーバーロードを選択します2つのオーバーロード

int main(int argc, const char *argv[]) { 
    foo(3);  // Calls foo(int) 
    int x = 3; 
    foo(x);  // <--- compilation error (ambiguous overload) 
    int& y = x; 
    foo(y);  // <--- still ambiguous 
    return 0; 
} 

質問は...どのようにint&過負荷を選択することができますか?

呼び出すことができない場合は、それをコンパイルするのは何ですか?

+3

静的キャスト(foo)(x); ' –

+2

あなたも理由は尋ねているので、ダイレクトダイプではないかもしれません。質問/ 1336 8474/ambiguous-call-to-overloaded-function-int-and-int) – George

+1

なぜ単純に過負荷の存在を診断することによって文法に複雑さを追加するのですか?それらは依然として2つの有効な過負荷です。問題はコールサイトで(それを回避する方法で)。 – StoryTeller

答えて

3

どのようにint&過負荷を選択できますか?


そして賢明左辺値と右辺値をオーバーロードする方法を探して、ここにさまよう人々のため

using fptr = void (*)(int&); 
fptr f = foo; 
int i; 
f(i); 
、解決策は右辺値参照を使用することです:

関数ポインタを使用して

void foo(int&&) { printf("foo(int&&)\n"); } 
void foo(int&) { printf("foo(int&)\n"); } 
関連する問題