考虑以下代码:
#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
}
这不会编译,因为typename outer<T>::inner
它是一个非推导上下文(如此处所述),这意味着编译器无法推导模板参数类型(请阅读此答案以了解原因)。正如我所看到的,我有两种选择可以让它发挥作用:
- 移出并使其成为类模板
inner
。outer
我更喜欢这个,因为对使用代码的影响更小。 - 将 - 方法添加
to_string
到内部。
是否有任何其他解决方案(不会导致使用代码中的难看语法)?