在模板中输出嵌套类

时间:2010-12-04 02:15:47

标签: c++ templates iostream

我正在尝试重载ostream运算符以允许输出模板中的嵌套类。但是,编译器无法将实际函数调用绑定到我的重载。

template <class T>
struct foo
{
    struct bar { };
};

template <class T>
std::ostream& operator << (std::ostream& os, 
    const typename foo<T>::bar& b)
{
    return os;
}

int main()
{
    foo<int>::bar b;
    std::cout << b << std::endl; // fails to compile
}

如果我将重载定义为内联friend函数,则会编译:

template <class T>
struct foo
{
    struct bar 
    { 
        friend std::ostream& operator << (std::ostream& os, const bar& b)
        {
            return os;
        }
    };
};

但我宁愿在课外定义重载。这可能吗?

1 个答案:

答案 0 :(得分:1)

没有。 :-) 你已经回答了自己的问题,但不知怎的,你不喜欢这个答案?约翰内斯链接到一个帖子,该帖子解释了内部类是“非推断的上下文”。如果foo模板有一些特殊化,可能会有几个具有相同内部条形类的foos。然后编译器无法弄清楚foo :: bar是什么,除非它为所有可能的Ts实例化foo。该标准表示它不必这样做。

您与朋友运营商的原始解决方案有什么问题?您不必在内联中定义它,只需在本地类中声明它。