如何编写依赖返回类型的C++模板自由函数及编译失败原因排查
编译失败原因
这是C++模板的待决名解析规则导致的问题:
你的ff_get本身是模板函数,参数t的类型T2要等到ff_get实例化时才能确定,属于「待决类型」。此时编译器默认不知道t的成员get是一个模板函数,会把代码里的get<T1>中的<解析为小于运算符,直接触发语法错误。
你之前调用foo<float>(a)能正常工作,是因为foo是全局模板,身份是固定的,不依赖任何待决的模板参数,编译器可以直接识别它是模板,不需要额外标记。
正确的ff_get实现
只需要在调用待决类型的成员模板前,加template关键字,告知编译器get是模板函数即可:
template <typename T1, typename T2> T1 ff_get(T2 t) { return t.template get<T1>(); }
如果要支持左值、右值MyClass实例的完美转发,也可以写成下面的版本:
#include <utility> template <typename T1, typename T2> T1 ff_get(T2&& t) { return std::forward<T2>(t).template get<T1>(); }
修改后你想要的调用语法auto v4 = ff_get<float>(m);就可以正常编译运行了。
内容的提问来源于stack exchange,提问作者kebs
相关产品推荐
相关产品推荐

