【问题标题】:How to use typedef recursively?如何递归使用 typedef?
【发布时间】:2020-03-04 14:10:42
【问题描述】:

我想编写一个关于每个学期一个人可以参加的课程的程序。我想定义一个名为 CourseTable 的数据类型,它是一个名为 Course 的结构的向量,但在这个结构中我还有一个“先决条件”变量,其类型我决定成为 CourseTable。

typedef vector<Course> CourseTable ;
struct Course
{
  ....
  CourseTable prerequisites;
};

我在放置这两个声明的顺序中都出现编译错误。你有什么建议我应该怎么做吗?

【问题讨论】:

    标签: c++ c++11 typedef


    【解决方案1】:

    尝试在结构中放置别名:

    struct Course {
        typedef std::vector<Course> CourseTable;
        CourseTable prerequisites;
    };
    

    然而,更多的 C++-ish 解决方案是使用 using 关键字作为类型别名:

    struct Course {
        using CourseTable = std::vector<Course>;
        CourseTable prerequisites;
    };
    

    或转发声明struct Courselike:

    struct Course;
    using CourseTable = std::vector<Course>;
    
    struct Course {
        CourseTable prerequisites;
    };
    

    【讨论】:

    • 请注意,这仅保证从 C++17 开始有效。在此之前,std::vector 的值类型需要在此时完成。
    【解决方案2】:

    您需要在typedef vector&lt;Course&gt; CourseTable; 之前转发声明Course。看起来像

    struct Course;
    typedef vector<Course> CourseTable;
    struct Course
    {
        CourseTable prerequisites;
    };
    

    【讨论】:

    • 这仅保证从 C++17 开始工作。在 C++17 std::vector 之前要求其值类型是完整的。 (问题标记为 C++11。)
    • @walnut 这不是问题。 typedef vector&lt;Course&gt; CourseTable; 实际上并没有创建 vector 的对象,因此没有实例化。紧随其后的是定义,所以应该没有问题。
    • @NathanOliver 我同意你的看法
    • @NutCracker / NathanOliver CourseTable prerequisites; 导致实例化,并且实例化点就在引用它的命名空间声明之前,即在 Course 的定义之前,如果我没记错的话。跨度>
    猜你喜欢
    • 2015-06-08
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2017-07-23
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多