Solución alternativa para la deducción de argumentos de plantilla en contexto no deducido

Considere el siguiente código:

#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
}

Esto no se compila, porquetypename outer<T>::inner es unnondeduced context (como se explicaaqu), lo que significa que el compilador no puede deducir el tipo de argumento de plantilla (leaesta respuesta por el por qué). Tal como lo veo, tengo dos opciones para que funcione:

Moverseinner fuera deouter y conviértalo en una plantilla de clase. Prefiero este, porque el impacto en el uso del código es menor.Agrega unto_string -método al interior.

¿Hay alguna otra solución para esto (que no genere una sintaxis fea en el código de uso)?

Respuestas a la pregunta(2)

Su respuesta a la pregunta