C++ 如何为模板的成员类型重载自由函数

C++ 如何为模板的成员类型重载自由函数,c++,templates,overloading,c++03,C++,Templates,Overloading,C++03,我有一个模板类,它定义了一些成员类型。它类似于std::map如何基于自己的模板参数定义它的value\u类型,但在我的例子中,类型更复杂,因此它被定义为嵌套类 现在,为了调试,我想定义操作符,这里有一个所谓的不可推断上下文。怎样才能推断出值?您可以部分地专门化类模板,使编译器几乎不可能尝试和测试每一个可能的实例化(其中有..嗯,无限) 有两种解决方法:从外部中取出内部,或者让操作符成为内部的内联好友@Xeo:你能回答这个问题吗?这听起来是个可行的主意。我不确定你能做到。看,它离你的很近。@Xe

我有一个模板类,它定义了一些成员类型。它类似于
std::map
如何基于自己的模板参数定义它的
value\u类型
,但在我的例子中,类型更复杂,因此它被定义为嵌套类


现在,为了调试,我想定义
操作符,这里有一个所谓的不可推断上下文。怎样才能推断出
?您可以部分地专门化类模板,使编译器几乎不可能尝试和测试每一个可能的实例化(其中有..嗯,无限)


有两种解决方法:从
外部
中取出
内部
,或者让
操作符成为
内部
的内联好友@Xeo:你能回答这个问题吗?这听起来是个可行的主意。我不确定你能做到。看,它离你的很近。@Xeo:是的,你可以。我试过了,效果很好。谢谢。我实际上是在重载而不是
操作符
#include <iostream>

template <typename Value> class Outer;

template <typename Value>
std::ostream &operator<<(std::ostream &, const typename Outer<Value>::Inner &);

template <typename Value>
class Outer {
  public:
    struct Inner {
    Value x;
    };

    void PrintSomething(Value v) {
    // the real program does something useful with the inner class, of course
    Inner inner = { v };
    std::cout << "Inner = " << inner << std::endl; // <---- THIS SAYS IT CAN'T FIND operator<<
    };
};

template <typename Value>
std::ostream &operator<<(std::ostream &s, const typename Outer<Value>::Inner &v) {
    return s << v.x;
}

int main() {
    Outer<int> o;
    o.PrintSomething(42);
    return 0;
}
template<class T>
struct Outer{
  struct Inner{
    T value;
    friend std::ostream& operator<<(std::ostream& os, Inner const& v){
      return os << v.value:
    }
  };
  // ...
};