考虑以下代码:
#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
方法。
是否还有其他解决方案可避免使用代码中出现丑陋的语法?