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