Рассмотрим следующий код:
#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
представляет собой неопределенный контекст (как описано here), что означает, что тип шаблона-аргумента не может быть выведен компилятор (прочитайте этот ответ, почему). Как я вижу, у меня есть два варианта, чтобы заставить его работать:
- Переместите
inner
внеouter
и сделайте его шаблоном класса. Я предпочитаю это, потому что влияние на код использования меньше. - Добавьте метод
to_string
к внутреннему.
Есть ли другие решения для этого (которые не приводят к уродливому синтаксису в используемом коде)?