#include <iostream>
template< typename U >
struct base {
template< typename T >
base const & operator<<(T x) const {
std::cout << sizeof(x) << std::flush;
return *this;
}
};
template< typename U >
struct derived : public base<U> {
using base<U>::operator<<;
derived const & operator<<(float const & x) const {
std::cout << "derived" << std::flush;
return *this;
}
};
int main() {
unsigned char c(3);
derived<double> d;
d << c;
d.operator<<(c);
return 0;
}
上記のコードの正解を得るには、(テンプレートの積み上げとオーバーライド、積分プロモーションなど...)ルールを説明してください。それは有効ですか?ルールが長すぎる場合は、文章の指針を提供してください。最新のコンパイラは、正しい結果については同意しません。 gcc-4.6とicpc-12.1.0は「11」が正解ですが、VS2010はあいまいさでd << c;
をコンパイルすることを拒否しますが、d.operator<<(c);
を受け入れます。後者は1
iircを出力します。誰が正しいのか、誰が間違っているのか?次のコードのISO C++標準に準拠した結果
ねえ、違いは何ですか? 'd << c'がMSVCでコンパイルされなければ、印刷する' 1'は1つだけです。他のコンパイラは2つの '1'を出力します。または私は何かを逃していますか? –
関係するデータ型がsizeof == 1:8のデータ型を持たないことを認識する必要があります。しかし、11は実際には2つの「1」のようです。 –
何が欲しいですか?コンパイラを試してみますか? –