你能帮我理解这个C ++模板代码吗?

时间:2011-04-08 09:42:33

标签: c++ templates

Hya星,

任何人都可以告诉我这件事是如何起作用的吗?

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>

非常感谢,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

这不是对象分配。它只是模板说明符中的语法,用于指定未提供默认类型参数的默认类型参数。 该类型的定义。

答案 1 :(得分: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