У меня есть следующие настройки:оператор перегрузки << для шаблона вложенного класса
template< class T >
struct Foo {
struct Bar {
Bar (const T &t) : otherT_(t) {}
T otherT_;
};
Foo (const T &t) : myT_(t) {}
T myT_;
};
Теперь я хочу, чтобы экземпляры Foo<T>::Bar
поточных в StD :: COUT и друзьям. Я попытался это:
template< class T >
std::ostream& operator<< (std::ostream &os,
const typename Foo<T>::Bar &bar) {
os << "<bar: " << bar.otherT_ << ">";
return os;
}
Но следующий код не компилируется:
Foo<int> foo(5);
Foo<int>::Bar bar(7);
std::cout << bar << std::endl;
Я предполагаю, что компилятор не может вывести тип T
или что-то. Есть ли способ сделать такие экземпляры вложенного класса хорошо себя вести с operator<<
?
Спасибо!
Copy/Paste [этот ответ] (http://stackoverflow.com/a/18823636/596781)? –
@KerrekSB Итак, ответ заключается в том, что просто невозможно написать 'std :: cout << bar'? Или я могу сделать однозначное сопоставление, указанное в связанном ответе, явным? – Sh4pe
@KerrekSB Я не уверен, что следую приведенному ответу. Причина для его ошибки проста: 'T' в' Foo :: Bar' невыводимый контекст, см. §14.8.2.5/5. Как и другие, указали , что делает работу с другом (потому что полученная функция не является шаблоном, поэтому не требуется никакого вывода типа). –