2013-10-20 265 views
1

爲什麼這個功能給我一個錯誤:默認參數和模板

template < typename T > 
T foo(T s = 0, const vector <T> &v) 
{ 
    ... 
} 

error: default argument missing for parameter 2 of ‘template summable sum(summable, const std::vector&)’

爲什麼不下面?:

template < typename T > 
T foo(const vector <T> &v, T s = 0) 
{ 
    ... 
} 
+0

* [可以將函數默認模板參數放在非默認模板參數之前嗎?](http://stackoverflow.com/questions/11684954/can-function-default-template-parameter-be-put-before - 非默認的)*。 –

回答

5

可選參數必須是最後一個。即非可選參數不能跟隨可選參數。

你怎麼會叫

T foo(T s = 0, const vector <T> &v) 

只是一個v,並沒有s

如何將編譯器點這一點,如果

  • sv有相同的類型,或者
  • 存在的foo超載只需花const vector<T>&
+0

謝謝,非常好的答案! – FacundoGFlores

2

如果參數具有默認值,那麼以下所有參數都需要具有默認值。

理由是在其他的答案給出,所以我給你從C++ 11標準報價:

8.3.6 Default arguments [dcl.fct.default]

4 (...) In a given function declaration, each parameter subsequent to a parameter with a default argument shall have a default argument supplied in this or a previous declaration or shall be a function parameter pack.

0

參數使用默認值必須是最後一個參數。首先,你的默認值是0,然後是v,沒有默認值。在帶有默認參數的參數之後,您無法使用默認參數。

你會如何使用默認值調用參數? foo(/*default*/,vector)