Обходное решение - определить operator<<
как друга внутри определения Bar
:
template< class T >
struct Foo {
struct Bar {
Bar ( const T &t ) : otherT_( t ) {}
T otherT_;
friend std::ostream& operator<< ( std::ostream &os, const Bar &bar )
{
os << "<bar: " << bar.otherT_ << ">";
return os;
}
};
Foo ( const T &t ) : myT_( t ) {}
T myT_;
};
Проблема с вашим подходом заключается в том, что, как сказал в комментариях KerrekSB, T не может быть выведено. Для Foo<T>::Bar
возможно бесконечно много T
, каждый из которых может привести и к другому типу.