Обходной путь для вывода аргументов шаблона в невыведенном контексте

Рассмотрим следующий код:

#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 :: inner - это невыведенный контекст (как объяснено здесь ), что означает, что тип аргумента-шаблона не может быть выведен компилятором (прочтите этот ответ , почему). На мой взгляд, у меня есть два варианта заставить его работать:

  1. Переместить внутренний за пределы внешнего и сделать его шаблоном класса. I предпочитаю этот, потому что влияние на используемый код меньше.
  2. Добавьте метод to_string к внутреннему.

Есть ли другие решения для этого (которые не приводят к некрасивому синтаксису в код использования)?

15
задан Benjamin 5 July 2018 в 13:49
поделиться