在模板类中使用内部类,它属于

时间:2017-07-30 14:01:39

标签: c++ templates inner-classes

我的代码

#include <iostream>
using namespace std;

template<typename E>
struct Node{};

template<typename E,typename I>
class List{
public:
  class Iterator{
  public:
  private:
    ListNodePtr ptr; //‘ListNodePtr’ does not name a type
  };
private:
  ListNodePtr foo(ListNodePtr); // ‘ListNodePtr’ does not name a type
  struct ListNode:public Node<E>{};
  typedef ListNode* ListNodePtr;
};

我收到错误消息(上面的评论)

我怎样才能让它发挥作用?

此外,我不确定如何在.cpp

中定义ListNodePtr foo (ListNodePtr)

我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

类型声明的用法应该更高。

在使用之前移动typedef

Here一个编译的演示。

答案 1 :(得分:0)

第一次使用时必须知道类型。 您必须更改声明的顺序。

注意,声明类ListNodePtr时必须知道类型List::Iterator,因为类在类中使用。

template<typename E,typename I>
struct List{
private:
    struct ListNode:public Node<E>{};
    typedef ListNode* ListNodePtr;
public:
    class Iterator{
        ListNodePtr ptr;
    };
private:
    ListNodePtr foo(ListNodePtr);
};

对于结构ListNode,您也可以使用前向声明。

template<typename E,typename I>
struct List{
private:
    struct ListNode; // forward declartion of the structure `ListNode`
    typedef ListNode* ListNodePtr;
public:
    class Iterator{
        ListNodePtr ptr;
    };
private:
    ListNodePtr foo(ListNodePtr);
    struct ListNode:public Node<E>{};
};