Проблема, которую вы описываете, не имеет ничего общего с двухэтапным поиском.Вместо этого это связано с тем, что в функции
template <typename Foo, typename Bar>
std::ostream& operator<<(std::ostream& out, const typename MyClass<Foo,Bar>::bar_t& bar)
Foo
и Bar
находятся в не выводимом контексте.Это означает, что вы должны предоставлять эти аргументы шаблона каждый раз, когда вызываете функцию.
Что касается того, что компилятор не может выводить типы здесь, давайте рассмотрим более простой пример того же, что не будет работать:
template<class T> struct A {
using type = int;
type i = 42;
};
template<class T> void foo(typename A<T>::type );
...
A<void*> a;
foo(a.i); // problematic call
Вы хотите, чтобы T
выводился в void*
в примере выше.Тем не менее, тип a.i
является int.Таким образом, этот вызов идентичен
foo(int(42));
Очевидно, что здесь нет никакого значимого компилятора T
, который мог бы вывести здесь.типы с потоками.Если вы не можете, то, вероятно, операторы вставки потоков не подходят для этого, так как синтаксис действительно ужасен.Просто используйте нормальные функции.