2012-11-28 108 views
5

我寫了下面的代碼的模板參數推導失敗:模板參數推導失敗

template<int> 
struct num {}; 

template<int m> 
void match(num<2*m>) { 
} 

int main() 
{ 
    match(num<2>()); 
    return 0; 
} 

我從一個感覺:編譯器不能推斷出正確的m知道,但我想了解的理論它爲什麼失敗的基礎。有人可以解釋嗎?

回答

6

那麼,你基本上是要求編譯器爲你解決方程2 * m == 2,以確定模板參數mmatch。編譯器在模板參數推導期間不解決方程式,無論它們是多麼簡單和毫不含糊。

在14.8.2.4/14的語言規範(C++ 03),14.8.2.5/16(C++ 11)涉及您的情況,並有類似的例子

如果,在與非型 模板參數,所述非類型模板參數是在函數參數列表中的 表達式中使用的,對應 模板參數必須在功能模板的聲明始終明確指定或在其他地方推導出 ,因爲類型扣除總是會失敗,例如 a 模板參數

template<int i> class A { /* ... */ }; 
template<short s> void g(A<s+1>); 

void k() { 
    A<1> a; 
    g(a); //error: deduction fails for expression s+1 
    g<0>(a); //OK 
} 

至於爲什麼它那麼做......我認爲這是很明顯的,在一般情況下,解決一個數學公式的問題太複雜了。它也可能導致模糊的解決方案或不屬於預期域的解決方案。例如,您希望編譯器推導出什麼樣的match(num<3>())

+0

不幸的是,最新的草案在這裏http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf甚至在這裏https://github.com/cplusplus/draft似乎沒有該款。但我聽你的話:) – keveman

+0

@keveman:我從C++ 03複製它。在C++ 11中,等價的部分是14.8.2.5/16 – AnT

+0

是的,明白了,謝謝。 – keveman