c – 非推导上下文中模板参数推导的解决方法
作者:互联网
请考虑以下代码:
#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是一个非弱的上下文(如here所解释的),这意味着编译器无法推断出template-argument-type(为了原因,请阅读this answer).在我看来,我有两个选项让它工作:
>将内部移到外部,使其成为类模板.我更喜欢这个,因为对使用代码的影响较小.
>向内部添加to_string方法.
是否有任何其他解决方案(在使用代码中不会导致丑陋的语法)?
解决方法:
您可以将操作符移动到内部类主体中并将朋友放在其前面.然后只用inner替换参数类型.
另一种技术是从内部参数化的CRTP基础派生内部.然后使参数键入CRTP类并将参数引用强制转换为派生的内部类,其类型由您推导出的模板参数给出.
标签:template-deduction,c,templates 来源: https://codeday.me/bug/20190917/1810072.html