【问题标题】:C++ templates - implementing outside the classC++ 模板 - 在类外实现
【发布时间】:2020-11-26 10:40:47
【问题描述】:

考虑以下声明

template<class T, int N>
class Stack 
{
public:
    Stack() : T[N]{} {};
    class iterator;
    iterator insert(iterator it, const T &v);
private:
    T[N];
};

template<class T, int N>
class Stack<T,N>::iterator
{
   ...
};

我想在课外实现Stack::insert,所以我尝试了以下

template<class T, int N>
Stack::iterator Stack<T, N>::insert(Stack::iterator p, const T &v)
{
    ...
}

现在我收到以下错误

'Stack' is not a class, namespace, or enumeration

我试着改成下面的

template<class T, int N>
Stack<T, N>::iterator Stack<T, N>::insert(Stack::iterator p, const T &v)
{
    ...
}

现在错误变为

Missing 'typename' prior to dependent type name 'Stack<T, N>::iterator'

我不明白为什么我会收到此错误以及如何解决它,希望有人能提供帮助

【问题讨论】:

标签: c++ templates iterator


【解决方案1】:

我很惊讶您收到您所说的错误,因为您在数据成员的构造函数中有一个非常明显的语法错误:

    Stack() : T[N]{} {};  // T[N] isn't valid!
    T[N];                 // same!

如果T = int,上面的内容将转换为int[4],从而导致错误。你可能想要的是:

    Stack() : arr{} {}  
    T arr[N];                 

假设这是固定的,我们终于得到了错误:

Missing 'typename' prior to dependent type name 'Stack<T, N>::iterator'

这是说iterator 是一种类型,您不能使用:: 运算符直接访问它。您必须在Stack&lt;T, N&gt;::iterator 之前编写typename,以便编译器知道您要访问Stack 中的子类型。阅读 answerWhere and why do I have to put the “template” and “typename” keywords? 了解更多详情。

要解决此问题,请将函数更改为:

template<class T, int N>
typename Stack<T, N>::iterator Stack<T, N>::insert(typename Stack::iterator p, const T &v)
//^^typename here                                  ^^ and here
{
  ...
}

您可能会觉得打字这么多是很忙的。因此,auto 关键字被引入,以避免程序员每次想要使用它时都要输入这些:

  Stack<int,4>::iterator i = s.insert(it, 3); // imagine typing this everytime
  //use auto
  auto it = s.insert(iterator, 3); //good

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2013-09-24
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多