You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写依赖返回类型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 20:45:04