模板参数推导失败:了解非推导上下文
在您的代码中,您定义了两个函数(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中文网其他相关文章!