2013-09-22 99 views
1

我有一個模板類,我遇到了一些問題。我有這個按照壓在另一大類:使用默認參數混合模板函數的錯誤

value.push_back(x); 

作爲XA unsigned int,值的模板類被稱爲List<unsigned int>和的push_back此功能:

template <class T> 
void List<T>::push_back(T a=T(),int l=1){ 
    (*this).resize((*this).size+l,a); 
} 

而且我在代碼塊以下錯誤:

...\mp.h|86|error: no matching function for call to 'List<unsigned int>::push_back(unsigned int)' 
...\mp.h|86|note: candidate is: 
...\list.h|36|note: void List<T>::push_back(T, int) [with T = unsigned int] 
...\list.h|36|note: candidate expects 2 arguments, 1 provided 

我不知道該怎麼做,該函數已經爲int的默認值,我已經嘗試了2個不同的編譯器,我真的不想在push_back中添加其他參數,以便它變成push_back(x,1)

回答

2

您是否在聲明中包含默認值?

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1); 
}; 

一個好的編譯器會拒絕編譯它,如果你沒有(或至少警告有關的差異),但只是要確定。

這是習慣性地「只是」實施模板成員級:

template <class T> 
struct List 
{ 
    void push_back(T a=T(),int l=1) 
    { 
     (*this).resize((*this).size+l,a); 
    } 
}; 
+0

我只是沒你說的話和排序的工作,我得到另一個錯誤,我認爲它沒有這個問題做。我無法理解的是,爲什麼默認參數沒有在聲明中工作,而沒有將函數模板化,以及爲什麼它可以在模板化時處於聲明中。 – user2054583

+0

我無法確定。但是這個問題似乎只是在調用的時候,編譯器沒有提供默認的參數值(因此不會「添加」它)。默認參數只是一個呼叫站點語法糖。這是一個混亂的頻繁來源。您可能想通過使用單獨的重載來代替所有的混淆。 – sehe

+0

@ user2054583那麼標準明確禁止在[dcl.fct.default]/6中除了類模板的成員函數外,在類定義之外出現的成員函數定義中的缺省參數將被添加到缺省集合由類定義中的成員函數聲明提供的參數。類模板的成員函數的默認參數應在類模板中的成員函數的初始聲明中指定。我只能猜測,這必須通過實例化或簡化(考慮專業化)。 – dyp