在非编辑上下文中扣除模板参数的解决方法
-
25-10-2019 - |
题
考虑以下代码:
#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
是一个 非核心上下文 (如解释 这里),这意味着编译器无法推导模板-argument-type(阅读 这个答案 为何)。如我所见,我有两个选择使它起作用:
- 移动
inner
在外面outer
并使其成为班级的模板。我更喜欢这个,因为对使用代码的影响较小。 - 添加一个
to_string
- 内心。
还有其他解决方案(在使用代码中不会导致丑陋的语法)?
解决方案
您可以将操作员移至内部阶级主体并放置 friend
之前。然后将参数类型替换为 inner
.
另一种技术是从内部参数的CRTP碱基来得出内部。然后使参数类型键入CRTP类并将参数引用到派生 inner
类,其类型由您推论的模板参数给出。
不隶属于 StackOverflow