Я могу определить и использовать:
std::ostream& operator<<(std::ostream& os, std::vector<int> const& container)
{
for (auto const& n : container)
os << n << ", ";
return os;
}
int main()
{
std::vector<int> data{0,1,2};
std::cout << data << '\n';
}
( демо )
Но определение этого оператора не зависит от того, какой контейнер я использую. Оттуда я бы хотел определить шаблонную версию:
template<class Iterable>
std::ostream& operator<<(std::ostream& os, Iterable const& iterable)
{
for (auto const& n : iterable)
os << n << ", ";
return os;
}
int main()
{
std::vector<int> data{0,1,2};
std::cout << data << '\n';
}
( демо )
Вот где мой компилятор злится и многословно отвергает его:
error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'char')
... с большим количеством возможных кандидатов.
Почему это не законно и как я могу определить такого оператора?