2010-11-23 14 views
5

は、次のプログラムを考えてみましょう。 Linuxの場合:テンプレート一定の型変換演算子

test.cc: In function ‘int main()’: 
test.cc:17: error: passing ‘const Pack<8>’ as ‘this’ argument of ‘Pack<s>::operator X&() [with X = double, int s = 8]’ discards qualifiers 

なぜですか? const型変換演算子を使用しないのはなぜですか?どのように私はこれを修正することができます便利なテンプレート型変換演算子(定数ではなくconstバージョン)。 ありがとう!

+0

GCC(とComeau)とは別のエラーが発生します。変換機能はありません。おそらく、 'operator double()'のような変換関数を探していて、適切なものを見つけられないからです(提供されたものも参照を持っているからです)。 - それが最初の良いアイデアなら、名前付きメンバ関数を使用してみませんか? – UncleBens

+0

@UncleBens、あなたは正しいです、下記を参照してください。 –

+0

packクラスは任意の型に変換可能である必要があるため、double()演算子は使用しません。私が掲示した例は、問題を示すために削除されています。 – Nathan

答えて

5

C++ 03標準によると、テンプレート引数の控除でX&またはX const&const doubleであると推測できないため、そのコードは不正です。

C++ 03は、控除前に変換関数の戻り値型から参照が取り除かれているとは言いませんでしたので、あなたの場合は決して一致しません。 C++ 0x、this will be fixedの場合は、最新の作業用紙に含まれているため、遡及的に修正を含む一部のコンパイラでコンパイルすることがあります。

あなたコードは、実際には異なる問題があります。Xに対してとX constに対して(!それは前控除にCV-修飾子を取り除き)GCC その不具合報告の解像度を実装しない、及びそのためのはdoubleを比較します。 Xと一致するだけなので、その最初の変換関数がconst Pack<8>引数を持つ呼び出しで1つの候補になります。そのため、GCCは変換機能で不足しているconstについて苦情を言います。次のコードを試してみるとうまくいくでしょう。

// can't strip cv-qualifiers off "double const&" - there are no top-level 
// cv qualifiers present here! 
double const &d(p); 
+0

const修飾子が 'double'から削除されているのはなぜですか?私が 'operator double const&()const'を追加したのはなぜでしょう?あなたはおそらく正しいですが、私はまだ理解していません... –

+0

@ constは 'const'が意味を持たないためです。この値は変換関数の戻り値からコピーされます。 'const'はポインタや参照に埋め込まれている場合にのみ意味があります。これは 'operator double const&'を実行するときにマッチします。なぜなら、それはテンプレート引数の減算を必要としないからです。ここで重要なのはテンプレート引数の減算だけです:*それは、テンプレートを扱うときに解像度が考慮する候補関数のオーバーロードをもたらします。 'operator double const&'を書くと候補関数を明示的に提供し、ここでは呼び出すことのできる候補関数です。 –

+0

もっと簡単な例を試してみましょう: 'template void f(T *);' 'f(0)'で呼び出すと 'int 'に対する' T * 'のテンプレート引数の減算が失敗するため、機能しません。しかし 'void f(char *);を宣言して' f(0) 'を呼び出すと、それは問題なく動作します。 –

関連する問題