2012-09-24 78 views
19

以下代碼段有什麼問題?候選模板被忽略,因爲無法推斷模板參數

#include <iostream> 

template<typename K> 
struct A { 
    struct X { K p; }; 
    struct Y { K q; }; 
}; 

template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

int main() { 
    A<float>::X x; 
    A<float>::Y y; 
    foo(x, y); 
} 

鐺提供了以下錯誤消息:

17:2: error: no matching function for call to 'foo' 
     foo(x, y);  
     ^~~ 
10:6: note: candidate template ignored: couldn't infer template argument 'K' 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    ^
1 error generated. 

回答

37

的參數Kconst typename A<K>::X不推斷出。基本上,::的所有內容都是不可扣除的(如果::分隔嵌套名稱)。

這是微不足道的,看看它爲什麼沒有意義通過這個思想實驗運行,要求扣除:

struct A { typedef int type; } 
struct B { typedef int type; } 

template <typename T> void foo(typename T::type); 

foo(5); // is T == A or T == B ?? 

有一個從類型嵌套類型沒有一個一對一映射:給定任何類型(例如如int),可能有許多環境類型,它是嵌套類型,或者不需要。

6
template<typename K> 
void foo(const typename A<K>::X& x, const typename A<K>::Y& y) { 
    std::cout << "A" << std::endl; 
} 

K不能推導出,因爲它是在non-deduced背景。

n3337 14.8.2.5/4

在某些情況下,然而, 值不參與型扣,而是使用了 要麼別處推導或明確指定的模板參數的值。 如果僅在未推導的 上下文中使用模板參數,且未明確指定模板參數,則模板參數推導失敗

n3337 14.8.2.5/5

非推導上下文是:

- 這是使用合格-id指定的類型的嵌套名稱說明符。