Рассмотрим следующий код:
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
Это не компилируется, потому что typename outer<T>::inner
представляет собой не выводимый контекст (как описано здесь ), что означаетшаблон-аргумент-тип не может быть выведен компилятором (прочитайте этот ответ для причины).На мой взгляд, у меня есть два варианта, чтобы заставить его работать:
- Переместить
inner
за пределы outer
и сделать его шаблоном класса.Я предпочитаю этот, потому что влияние на использование кода меньше. - Добавьте
to_string
-метод к внутреннему.
Существуют ли другие решения для этого (которые делаютне приводит к уродливому синтаксису в используемом коде)?