2015-09-18 58 views
3

我有這樣的功能:模板扣失敗,參數包後的說法

template <typename... Args> 
void f(Args... args, int last) 
{ 
} 

模板扣失敗,如果我把它叫做沒有明確的模板參數:

f(2, 2); // candidate expects 1 argument, 2 provided 

但給了明確的模板參數參數包的工作原理如下:

f<int>(2, 2); // compiles fine 

即使從邏輯上講,編譯器應該能夠推斷參數包由除最後一個參數類型之外的所有參數組成。我將如何解決這個問題?

回答

5

[temp.deduct.type]/P5:

非推導上下文是:

  • [...]
  • 不發生在一個函數參數包參數聲明列表的結尾。

爲了得到扣,你就必須做

template <typename... Args> 
void f(Args... args) 
{ 
} 

,並切掉體內的最後一個參數,或使lastfirst代替:

template <typename... Args> 
void f(int first, Args... args) 
{ 
} 

很難給出更具體的建議,因爲我們不知道這個函數模板應該做什麼。

1

從[temp.deduct.type]:

非推導上下文是:
[...] - 這不會在的端部發生的函數參數包參數 - 聲明清單

您的參數包args是一個非推導的上下文,因爲它不是最後一個參數。如名稱所暗示的,未推論的上下文無法推斷 - 這導致模板推演失敗。

當您明確提供模板參數(通過f<int>(2, 2))時,不必進行扣減,因此代碼沒問題,您只是明確地調用f<int>(int, int)