2013-06-12 85 views
12

代碼:默認參數類封閉

template <typename element_type, typename container_type = std::deque<element_type> > 
class stack 
{ 
    public: 
     stack() {} 
     template <typename CT> 
     stack(CT temp) : container(temp.begin(), temp.end()) {} 
     bool empty(); 
    private: 
     container_type container; 
}; 

template <typename element_type, typename container_type = std::deque<element_type> > 
bool stack<element_type, container_type>::empty() 
{ 
    return container.empty(); 
} 

當我編譯它給人的錯誤。對於類封閉'bool stack<element_type,container_type>::empty()'

爲什麼編譯器抱怨,我怎樣才能使它發揮作用的模板參數

默認參數?

+0

這是真的完整的錯誤信息嗎?它看起來像缺少一些東西... –

+0

@TimoGeusch:它的確用g ++和'--std = C++ 0x'編譯。雖然實際上是正確的,但乍一看並不是很有幫助:/ –

回答

20

您嘗試爲第二模板參數stack默認參數兩次。默認的模板參數,就像默認的函數參數一樣,只能定義一次(每個翻譯單元)。甚至不重複完全相同的定義是允許的。

在您定義的類模板開始只需鍵入默認參數。之後,將其忽略:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

非常感謝你,它的工作原理 – huals

2

該默認參數,通過語法,默認參數的類,它纔有意義,在類的聲明。

如果你想調用該函數...

stack<foo,bar>().empty(); 

你只有類的名稱,以便您已經在模板類聲明的時候提供的默認參數的網站上的模板參數。

您可以通過簡單地從函數定義中刪除默認的參數解決該問題:

template<typename element_type,typename container_type> 
bool stack<element_type,container_type>::empty(){ 
    return container.empty(); 
} 
+0

你是對的,非常感謝你! – huals