首页 >后端开发 >C++ >为什么我的 C 模板参数推导在非推导上下文中失败?

为什么我的 C 模板参数推导在非推导上下文中失败?

Barbara Streisand
Barbara Streisand原创
2024-12-06 09:45:13946浏览

Why Does My C   Template Argument Deduction Fail in Nondeduced Contexts?

模板参数推导失败:了解非推导上下文

在您的代码中,您定义了两个函数(temp 和 temp2),它们旨在根据参数类型推导模板实参。但是,您会遇到编译器错误,指出它无法推断出这些参数。

问题源于在函数定义中使用 typename 关键字:

// Example 1
template <class A>
A temp(typename S<A>::type a1)

// Example 2
template <class A, class B>
B temp2(typename S<A>::type a1, B a2)

使用模板模板参数时, typename 是引用模板类中的依赖名称所必需的。然而,在函数的上下文中情况并非如此,其中 S::type 只是一个非依赖类型。

在 C 中,当模板参数用于决定其类型的上下文。但是,在本例中,模板参数 A 在非推导上下文中使用,因为它仅出现在引用类型的声明中:

typedef typename T& type;

因此,编译器无法从函数调用。要解决此问题,您需要在调用这些函数时显式指定模板参数:

temp<char>(c);

通过提供显式参数,编译器能够使用适当的类型正确实例化模板。

以上是为什么我的 C 模板参数推导在非推导上下文中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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