Я пытаюсь перегрузить оператор ostream, чтобы разрешить вывод для вложенного класса внутри шаблона. Однако компилятор не может связать фактический вызов функции с моей перегрузкой.
template <class T>
struct foo
{
struct bar { };
};
template <class T>
std::ostream& operator << (std::ostream& os,
const typename foo<T>::bar& b)
{
return os;
}
int main()
{
foo<int>::bar b;
std::cout << b << std::endl; // fails to compile
}
Это скомпилируется, если я определю перегрузку как встроенную friend
функцию:
template <class T>
struct foo
{
struct bar
{
friend std::ostream& operator << (std::ostream& os, const bar& b)
{
return os;
}
};
};
Но я бы лучше определил перегрузку за пределами класса. Возможно ли это?