#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. Так кто прав, а кто виноват?
d << c
не компилируется в MSVC, то нужно напечатать только один1
. Другие компиляторы печатают два1
. Или я что-то упускаю? - person J.N.   schedule 22.02.20121
. - person J.N.   schedule 22.02.2012c
является аргументом для<<
, аsizeof c == 1
. А если программа не скомпилируется, то ничего и не напечатает. - person Mike Seymour   schedule 22.02.2012<<
, чтобы получить какой-то результат на MSVC, поэтому только одна печать). - person J.N.   schedule 22.02.2012