【问题标题】:When to write the template angle brackets (<...>)?什么时候写模板尖括号(<...>)?
【发布时间】:2018-03-14 18:30:43
【问题描述】:

给定这个示例类模板:

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&lt;T&gt;::push(const T&amp; t) 而不是void Stack::push(const T&amp; t)pop 方法也是如此)。

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

未找到成员声明

因为这些行:

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

【问题讨论】:

  • 在旧的编译器中没问题,但现在你应该使用void Stack&lt;T&gt;::

标签: c++ class templates


【解决方案1】:

push方法和pop方法的实现部分可以吗?我不明白是否需要编写 void Stack::push(const T& t) 而不是 void Stack::push(const T& t) (对于 pop 方法也是如此)。

你需要使用

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

template <typename T>
void Stack<T>::pop() { ... }

名称Stack 与类模板定义中的Stack&lt;T&gt; 用作类型名称时相同。在类模板定义之外,您必须显式提供模板参数。

【讨论】:

  • 据此,尚不清楚为什么(与此相反)我可以写throw Full(); - 为什么它不给出错误并要求这样写:throw Stack&lt;T&gt;::Full();
  • @J.Roe,在Stack&lt;T&gt;的成员函数的定义中,Stack&lt;T&gt;定义的所有类型名都在范围内。因此,Full()Stack&lt;T&gt;::Full() 相同。
  • 即使成员函数的实现在类外?
  • @J.Roe,是的。确实如此。
  • 只是为了确定我理解。例如,如果我想主要打电话给Full() Empty(),我必须写Stack&lt;T&gt;::Full()Stack&lt;T&gt;::Empty() ?
【解决方案2】:

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&lt;T&gt;.

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2018-10-13
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多