Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在所属的模板类中使用内部类_C++_Templates_Inner Classes - Fatal编程技术网

C++ 在所属的模板类中使用内部类

C++ 在所属的模板类中使用内部类,c++,templates,inner-classes,C++,Templates,Inner Classes,我的代码 #包括 使用名称空间std; 模板 结构节点{}; 模板 班级名单{ 公众: 类迭代器{ 公众: 私人: ListNodePtr ptr;//“ListNodePtr”未命名类型 }; 私人: ListNodePtr foo(ListNodePtr);//“ListNodePtr”未命名类型 结构ListNode:公共节点{}; typedef ListNode*ListNodePtr; }; 我收到错误消息(上面的评论) 我怎样才能让它工作 此外,我不知道如何在.cpp中定义lis

我的代码

#包括
使用名称空间std;
模板
结构节点{};
模板
班级名单{
公众:
类迭代器{
公众:
私人:
ListNodePtr ptr;//“ListNodePtr”未命名类型
};
私人:
ListNodePtr foo(ListNodePtr);//“ListNodePtr”未命名类型
结构ListNode:公共节点{};
typedef ListNode*ListNodePtr;
};
我收到错误消息(上面的评论)

我怎样才能让它工作

此外,我不知道如何在.cpp中定义
listnodeptrfoo(ListNodePtr)


我非常感谢您的帮助。

类型声明的用法应该更高

在使用前移动
typedef


编译的演示。

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

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

#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;
};

可能正在移动
typedef ListNode*ListNodePtr以上
类迭代器{
会有帮助吗?您正在使用结构列表,我认为它应该是类List@user1000
class
struct
之间只有3个区别。成员的默认访问说明符。从类型继承时的默认访问说明符。并且可以使用
class
而不是
typename
用于模板参数,但不能使用
struct
。因此,使用
struct
非常好。@FrankWang您可以将其标记为私有。实际上,使用access说明符作为前缀而不是按其分组是一种很好的做法。哦,这样做了,谢谢!
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);
};
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>{};
};