为了账号安全,请及时绑定邮箱和手机立即绑定

为什么模板参数推导在这里不起作用?

为什么模板参数推导在这里不起作用?

C++
www说 2019-09-26 15:06:58
为什么模板参数推导在这里不起作用?我创建了两个简单的函数,它们获取模板参数和一个定义类型的空结构://S<T>::type results in T&template <class T>struct S{     typedef typename T& type;};//Example 1: get one parameter by reference and return it by valuetemplate <class A>A temp(typename S<A>::type a1){     return a1;}//Example 2: get two parameters by reference, perform the sum and return ittemplate <class A, class B>B temp2(typename S<A>::type a1, B a2)//typename struct S<B>::type a2){     return a1 + a2;}参数类型应用于结构S以获得引用。我用一些整数值来调用它们,但是编译器无法推断出参数:int main(){     char c=6;     int d=7;     int res = temp(c);     int res2 = temp2(d,7);}错误1错误C2783:“ A temp(S :: type)”:无法推断出“ A”的模板参数错误2错误C2783:“ B temp2(S :: type,B)”:无法推断出“ A”的模板参数为什么会这样呢?很难看出模板参数是char和int值吗?
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

就像第一个注释一样,当您提到从属名称时,将使用typename 名称。因此,您在这里不需要它。

template <class T>struct S{
    typedef T& type;};

关于模板实例化,问题在于typename S<A>::type表征A 的非推导上下文。当仅在非推导上下文中使用模板参数时(函数中A的情况),模板参数推导未考虑在内。详细信息在C ++ Standard(2003)的14.8.2.4节中。

要使呼叫正常工作,您需要明确指定类型:

temp<char>(c);


查看完整回答
反对 回复 2019-09-26
?
白衣非少年

TA贡献1155条经验 获得超0个赞

它看起来像非推论上下文。根据C ++标准14.8.2.4/4:

不可推论的上下文是:

  • 使用qualified-id 指定的类型的嵌套名称说明符。

  • 一种是template-id的类型,其中一个或多个template-arguments是引用template-parameter的表达式。

当以包括非推断上下文的方式指定类型名称时,构成该类型名称的所有类型也是非推断的。但是,复合类型可以包括推导类型和非推导类型。[ 示例:如果将类型指定为A<T>::B<T2>,则TT2都不能被推导。同样地,如果一个类型被指定为A<I+J>::X<T>IJ,和T是nondeduced。如果一个类型被指定为void f(typename  A<T>::B,  A<T>),所述TA<T>::B是nondeduced但TA<T>推导。]


查看完整回答
反对 回复 2019-09-26
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

推论向前推:

template <class T> void f(T);f(2); // can deduce int from T

为什么会这样呢?

它在向后的方向上不起作用(您的示例):

template <class A> void g(typename S<A>::type);

很难看出模板参数是char和int值吗?

模板推导可以完成一些神奇的(图灵完成)任务,但是我不认为这是其中之一。

您可能会使用类似(未经测试)的内容:

template <class SA> void h(SA a1){
    STATIC_ASSERT(same_type<SA, S<A>::type>::value);
    typedef typename SA::type A;

    ...}

使用您喜欢的静态断言库(Boost有两个)。


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 782 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信