Ответ 1
operator<<(cout, '1'); // ok
operator<<(cout, "1"); // ok
operator<<(cout, 1); // error
Первые два работают, потому что они вызывают функции нечлена, принимающие два аргумента. Функции, которые принимают char
и char const*
в качестве аргумента, определяются как нечленные (свободные) функции.
Однако функция, которая принимает int
как аргумент, определяется как функция-член, а это значит, что третье нужно вызвать функцию-член. Если вы вызываете его как функцию, отличную от члена, тогда int
необходимо преобразовать в некоторый тип, для которого существует функция, не являющаяся членом. Поэтому, когда это преобразование считается, это приводит к двусмысленности, потому что существует много возможных преобразований одинаково хорошо.
Как сказано, это должно работать:
cout.operator<<(1); //should work
Что касается того, почему некоторые функции определяются как члены и другие как нечлены, я не знаю ответа. Это требует большого изучения предложений и решений, которые привели к этому дизайну библиотеки.