3 回答

TA貢獻1842條經驗 獲得超22個贊
就像第一個注釋一樣,當您提到從屬名稱時,將使用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 關注
- 871 瀏覽
添加回答
舉報