2011-04-08 127 views
0

Hya,你能幫我理解這個C++模板代碼嗎?

任何人都可以告訴我這是怎麼回事?

template <typename T, 
template <typename ELEM> class CONT = std::deque > 
class Stack { 
private: 
CONT<T> elems; // elements 

public: 
void push(T const&); // push element 
void pop(); // pop element 
T top() const; // return top element 
bool empty() const { // return whether the stack is empty 
return elems.empty(); 
} 
}; 

什麼,我不明白的是: 模板類V或說這個 「模板類CONT =的std :: deque的」

我想象這是

template <class> 
class CONT = std::deque // here CONT is templatized class declaration. 

但什麼讓我感到厭煩的是,我們如何給類名稱CONT分配一些東西,而不是寫下它的定義(我一直這樣做直到這一次):

template <class> 
class CONT{ 
//def 
} 

一件事:

template <class> // why its only class written in angle bracket there should be also be name 
like : template<class ty> 

非常感謝,任何幫助是非常讚賞)

+1

**這不會起作用**'std :: deque'有兩個參數(一個是可選的),因此只能作爲'template'模板參數傳遞**兩個**參數。在這裏,你可以將'std :: deque '(而不是'std :: deque')作爲普通的模板參數傳遞:這就是'std :: stack'的工作原理。一般來說,模板模板參數不夠靈活,不值得使用它們的麻煩(除了在元編程上下文中)。 – 2011-04-08 09:49:47

+0

你的代碼有很多的語法錯誤。我只固定一個。 – 2011-04-08 09:51:53

+0

@Tomalak:是的,但你做得更糟。 – Potatoswatter 2011-04-08 10:00:10

回答

1

什麼,我不明白的是:模板V類

。在你的問題上沒有這樣的行,所以我不能與幫助。

template< template <typename ELEM> class CONT = std::deque > 
class Stack 

這是一個模板模板參數的聲明。您將模板傳遞到Stack模板,然後Stack可以在內部使用它。

= std::deque部分是默認值,以防您未指定CONT參數。 (std::deque是一個預定義的模板。)

但是,這不起作用,因爲std::deque有兩個參數。這將工作:

template< template <typename ELEM, typename ALLOC> class CONT = std::deque > 
class Stack 

然而ELEMALLOC實際上沒有任何名字;它們的存在僅僅是爲了說明所需模板的參數列表是什麼。所以,你可以省略它們:

template< template <typename, typename> class CONT = std::deque > 
class Stack 
+0

你能否以深入的和更基本的形式解釋「我不明白的是:模板類V或者說這個」模板類CONT = std :: deque「。非常感謝) – 2011-05-03 15:02:05

1

這不是一個對象分配。它只是模板說明符中的語法,用於指定如果沒有提供默認類型參數應該是什麼。這是而不是該類型的定義。

+0

他說什麼。所以'CONT'是'Stack'的第二個模板參數,'CONT'本身就是一個模板類,最後CONT的默認值是'std :: deque'。 – Ilkka 2011-04-08 09:52:31

+0

@Ilkka:是的,雖然'CONT'是一個模板類,它是OP代碼中的一個語法錯誤,因爲他實際上並不這樣認爲。 – 2011-04-08 09:53:18

+0

是的,我的力量太弱,無法在編譯器中檢測到它。謝謝你的澄清:) – Ilkka 2011-04-08 09:54:09