Он не компилируется, потому что вы просите, чтобы operator <<
был вызван автоматически. Это похоже на operator +
, а также на оператор преобразования, который может преобразовывать в базовый тип (скажем, в int
). Например:
class Conversion
{
public:
operator int()
{
return 5;
}
int operator +(int x)
{
return 10;
}
};
И используя его как:
Conversion conv;
conv + 1.0;
Здесь operator +
не может быть вызван неявно, так как operator int
также возможен. Если вы сдадите, int
, однако, будет вызван operator +(int)
. Чтобы вызвать оператор + с помощью double
, мы можем сделать:
conv.operator+(1.0);
Я не знаю о правилах компилятора и строгом определении стандартов .
Я также обнаружил, что если мы изменим классы base
и derived
как не шаблонные классы, проблема все равно останется (в VC10 / 11):
struct base {
base const & operator<<( int x ) const {
std::cout << sizeof( x ) << std::flush;
return *this;
}
};
struct derived : public base{
using base::operator<<;
derived const & operator<<( float const & x ) const {
std::cout << "derived" << std::flush;
return *this;
}
};
int main()
{
derived d;
d<<10.0; // ERROR
}