何时编写模板尖括号 (<...>)?

When to write the template angle brackets (<...>)?

本文关键字:lt gt 何时编      更新时间:2023-10-16

给定此示例类模板:

template<typename T>
class Stack {
    T * data;
    int size;
    int nextIndex;
public:
    Stack(int size = 100);
    Stack(const Stack& stack);
    ~Stack();
    Stack& operator=(const Stack& s);
    void push(const T& t);
    void pop();
    T& top();
    const T& top() const;
    int getSize() const;
    class Full {
    };
    class Empty {
    };
};
template<typename T>
void Stack::push(const T& t) {
    if (nextIndex >= size) {
        throw Full();
    }
    data[nextIndex++] = t;
}
 
template<typename T>
void Stack::pop() {
    if (nextIndex <= 0) {
        throw Empty();
    }
    nextIndex--;
}  

pushpop方法的实现部分可以吗?

我不明白我是否需要编写void Stack<T>::push(const T& t)而不是void Stack::push(const T& t)(pop方法也是如此(。

注意:Eclipse(根据C++11(给了我下一个错误:

未找到成员声明

因为这些行:

void Stack::push(const T& t) { 
void Stack::pop() {

推送法和弹出法的实现部分可以吗?我不明白我是否需要写void Stack::p ush(const T&t(而不是void Stack::p ush(const T&t((pop方法也是如此(。

您需要使用

template <typename T>
void Stack<T>::push(const T& t) { ... }
template <typename T>
void Stack<T>::pop() { ... }

名称Stack与类模板定义中用作类型名时Stack<T>相同。在类模板定义之外,必须显式提供模板参数。

push()pop() 都是 Stack 类模板的(非模板(成员函数。由于此类模板Stack类型模板参数(即:T(参数化,因此这些成员函数也是如此。

因此,这些成员函数的实现需要一个类型模板参数:

template<typename A>
void Stack<A>::push(const A& t) { ... }
template<typename B>
void Stack<B>::pop() { ... }

请注意,模板参数的名称实际上是无关紧要的(AB上面(。

还要注意的是,类模板的名称Stack定义主体内不后跟任何模板参数,等效于类模板,其模板参数作为模板参数,即:Stack<T>