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);
TA贡献1155条经验 获得超0个赞
它看起来像非推论上下文。根据C ++标准14.8.2.4/4:
不可推论的上下文是:
使用qualified-id 指定的类型的嵌套名称说明符。
一种是template-id的类型,其中一个或多个template-arguments是引用template-parameter的表达式。
当以包括非推断上下文的方式指定类型名称时,构成该类型名称的所有类型也是非推断的。但是,复合类型可以包括推导类型和非推导类型。[ 示例:如果将类型指定为
A<T>::B<T2>
,则T
和T2
都不能被推导。同样地,如果一个类型被指定为A<I+J>::X<T>
,I
,J
,和T
是nondeduced。如果一个类型被指定为void f(typename A<T>::B, A<T>)
,所述T
在A<T>::B
是nondeduced但T
在A<T>
推导。]
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有两个)。
- 3 回答
- 0 关注
- 782 浏览
添加回答
举报