我正在尝试重载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;
}
};
};
但我宁愿在课外定义重载。这可能吗?
答案 0 :(得分:1)
没有。 :-) 你已经回答了自己的问题,但不知怎的,你不喜欢这个答案?约翰内斯链接到一个帖子,该帖子解释了内部类是“非推断的上下文”。如果foo模板有一些特殊化,可能会有几个具有相同内部条形类的foos。然后编译器无法弄清楚foo :: bar是什么,除非它为所有可能的Ts实例化foo。该标准表示它不必这样做。
您与朋友运营商的原始解决方案有什么问题?您不必在内联中定义它,只需在本地类中声明它。