如果typedef将其所在的类用作参数,是否有将typedef放入类中的陷阱?
#include <memory>
class Foo{
public:
typedef std::shared_ptr<Foo> shared_ptr;
}
void main(){
Foo x;
Foo::shared_ptr p = std::make_shared<Foo>();
}
上面的代码对我(叮当声)有效,但是我想知道该标准是否有话要说。
答案 0 :(得分:4)
typedef
类中的Foo
是声明,而不是定义,因此可以执行您正在做的事情。如果它是一个定义,那将是不允许的,因为Foo
类的定义要等到大括号后才完整。
6.1声明和定义[basic.def]
2声明是定义,除非
...(2.9)-它是
typedef
声明(10.1.3),
但是,如果您做了这样的事情:
class Foo{
public:
Foo f; //A definition
}
Foo f
将被视为定义,而compiler will issue an error将被视为
error: field has incomplete type 'Foo' Foo f; ^ <source>:1:7: note: definition of 'Foo' is not complete until the closing '}' class Foo{