C++ 递归类型定义

C++ 递归类型定义,c++,typedef,recursion,C++,Typedef,Recursion,以下是允许的吗 typedef Foo<Bar> Bar; typedef Foo-Bar; 我的编译器抱怨“class Bar”之前有一个声明为“class Bar”。如果Bar是作为Foo模板参数的类,它不能同时是typedefedFoo。 您将重新定义Bar,首先作为一个独立类,然后作为一个模板实例化,但甚至是typedef Foo-Bar将不起作用。如果Bar是作为Foo模板参数的类,则不能同时将其定义为Foo。 您将重新定义Bar,首先作为一个独立类,然后作为一个模板实

以下是允许的吗

typedef Foo<Bar> Bar;
typedef Foo-Bar;

我的编译器抱怨“class Bar”之前有一个声明为“class Bar”。

如果Bar是作为Foo模板参数的类,它不能同时是typedefed
Foo


您将重新定义Bar,首先作为一个独立类,然后作为一个模板实例化,但甚至是
typedef Foo-Bar将不起作用。

如果Bar是作为Foo模板参数的类,则不能同时将其定义为
Foo


您将重新定义Bar,首先作为一个独立类,然后作为一个模板实例化,但甚至是
typedef Foo-Bar将不起作用。

您所做的等同于:

struct A {};
struct B {};
typedef A B;

毫无疑问,这是不合法的。

你所做的等同于:

struct A {};
struct B {};
typedef A B;

不可不合法。

< P>不允许。

< P>不允许。

为什么人们认为这样做有意义?考虑一个状态机,其中每个状态函数返回指向下一个函数执行的指针。此类函数的类型是递归的。可以用类(StuttStaseFuffe{StaseFoeCuffor())(Vult*Wrar);(};),而不是用原始函数或Type Debug来表达。为什么人们会认为这样做是有意义的?考虑一个状态机,每个状态函数都返回一个指针指向下一个要执行的函数。此类函数的类型是递归的。你可以用类(StuttStaseFoe{{StaseFoeCuffor)(Vult*Wrar);(};),但不与,如原始函数或Type Debug。Typedefs和类在C++中不在不同的命名空间中,因此在C++中是不合法的。Typedefs和类在C++中没有不同的命名空间,因此在C++中是不合法的。