2012-04-29 15 views
3

私はこの機能をC++で見つけ出すのに少し驚きました。ここで関数のパラメータを同じ型に強制し、型コンストラクタを使用して指定された型に一致させることはできません。

コードです:

struct XY { 
    int x,y; 
    XY(int v) : x(v), y(v) {} 
}; 

bool test1(const XY &pos){ 
    return pos.x < pos.y; 
} 
bool test1(int x, int y){ 
    return x < y; 
} 
void functest(){ 
    int val = 5; 
    test1(val); 
} 

だから私は、このような過負荷が存在することは、同じタイプのコンストラクタを持っているので、それはXY型の機能を使用するかどうかにかかわらず、整数パラメータを持つ関数を呼び出すことができます!私はそれが起こることを望んでいません、私はこれを防ぐために何ができますか?

答えて

6

XYコンストラクタを明示的に:

explicit XY(int v) : x(v), y(v) {} 

これはあなたが単一パラメータtest1関数を呼び出す際に何が起こっているかである、intからXYに暗黙的な変換を禁止します。

-2

なぜこれが悪いのか分かりません。あなたのコードには文字通り一致するものはありません。あなたは1つのパラメータで関数を呼び出し、それに最もよくマッチします。

あなたがこれを持っていた場合、それは違うだろう:

bool test1(const XY &pos){ 
    return pos.x < pos.y; 
} 

bool test1(int x){ 
    return !x; 
} 

void functest(){ 
    int val = 5; 
    test1(val); 
} 

それが最初に実行した場合C++には「賛成」しないとして、それは暗黙のコンストラクタを使用して、悪いことでしょう。それは "まずタイプしてから、そのタイプをコンストラクタに持つオブジェクト"を優先します。

しかし、あなたが持っているものは、1つの引数対2つの引数です。なぜこれが問題なのかわかりません。

+1

私は元々3つの関数を持っていました:XY、int + int、int。 intのために、配列アクセスのためにx/y値を1つの整数に組み合わせました。私はこのメソッドがいくつかの状況で非常に危険であることに気付きました。そのため、コードを変更する最も簡単な方法はint関数を削除することでしたが、修正する場所。しかし、私はまだ型が別の型のコンストラクタからそのように変換されるべきではないと思う...ちょうど私に奇妙なようです。 – Rookie

+1

-1:C++のメーカは非常に良い理由で '明示的に '追加しました。コンストラクタが特定のパラメータを取っているからといって、常に変換を許可するつもりはありません。時々、あなたは本当にエラーが欲しいです、あなたはコンパイラがそれを動作させる方法を見つけることを望んでいません。 「働く」ことは間違っているからです。 –

+0

さて、わかりました。そしてそれは人のために-1を出そうとする理由ではありません。与えられた例では、私がそれに応答したとき、それは1つの引数と2つの引数のために非因数であり、 'explicit'キーワードを必要とすることとは関係ありませんでした。 –

関連する問題