模板什么时候写尖括号(<...>)?

J.R*_*Roe 1 c++ templates class

给出这个示例类模板:

\n\n
template<typename T>\nclass Stack {\n    T * data;\n    int size;\n    int nextIndex;\npublic:\n    Stack(int size = 100);\n    Stack(const Stack& stack);\n    ~Stack();\n    Stack& operator=(const Stack& s);\n    void push(const T& t);\n    void pop();\n    T& top();\n    const T& top() const;\n    int getSize() const;\n\n    class Full {\n    };\n    class Empty {\n    };\n};\n\ntemplate<typename T>\nvoid Stack::push(const T& t) {\n    if (nextIndex >= size) {\n        throw Full();\n    }\n    data[nextIndex++] = t;\n}\n\xc2\xa0\ntemplate<typename T>\nvoid Stack::pop() {\n    if (nextIndex <= 0) {\n        throw Empty();\n    }\n    nextIndex--;\n}  \n
Run Code Online (Sandbox Code Playgroud)\n\n

push和方法的实现部分可以吗pop

\n\n

我不明白我是否需要写void Stack<T>::push(const T& t)代替void Stack::push(const T& t)(并且方法相同pop)。

\n\n

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

\n\n
\n

未找到会员声明

\n
\n\n

因为这些行:

\n\n
void Stack::push(const T& t) { \nvoid Stack::pop() {\n
Run Code Online (Sandbox Code Playgroud)\n

R S*_*ahu 5

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() { ... }
Run Code Online (Sandbox Code Playgroud)

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

  • @J.Roe,在 `Stack&lt;T&gt;` 的成员函数的定义中,所有定义了 `Stack&lt;T&gt;` 的类型名都在范围内。因此,“Full()”与“Stack&lt;T&gt;::Full()”相同。 (2认同)