首页 >后端开发 >C++ >为什么在不可推导的上下文中,模板参数推导会因'std::map”而失败?

为什么在不可推导的上下文中,模板参数推导会因'std::map”而失败?

Linda Hamilton
Linda Hamilton原创
2024-12-17 07:33:25911浏览

Why Does Template Argument Deduction Fail with `std::map` in a Non-Deducible Context?

不可推导上下文中的模板参数推导问题

在此代码片段中,我们在尝试使用测试函数时遇到错误与 TMap instance:

struct TMap
{
    typedef std::map<T, T> Type;
};

template<typename T>
T test(typename TMap<T>::Type &amp;tmap_) { return 0.0; }

int main()
{
    TMap<double>::Type tmap;
    tmap[1.1] = 5.2;
    double d = test(tmap); // Error
}

该错误源于编译器无法从函数的参数 tmap 推导出 T 模板参数。出现这种情况是因为我们处于不可推导的上下文中,无法从函数调用的参数中推断出模板参数。

在基于模板的编程中,在某些情况下编译器可以自动从函数调用参数中推导出模板参数。这称为模板参数推导。但是,在这种情况下,编译器无法根据 tmap_ 推导 T,因为它是 std::map 的实例,它不直接绑定到 TMap::Type。

如果我们将 TMap 专门化为特定的 T 类型,则编译器将无法确定要应用哪个专门化,因为 std::map 是这样的。可以与 TMap 配对和 TMap

要解决这个问题,我们可以在调用测试函数时显式指定 T 模板参数:

double d = test<double>(tmap);

通过指定 double 作为模板参数,编译器可以正确推导 tmap_ 的类型并得出其与 TMap::Type 匹配的结论。

以上是为什么在不可推导的上下文中,模板参数推导会因'std::map”而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn