将typedef放在使用类本身作为模板参数的类中是否有效?

时间:2019-02-14 03:46:41

标签: c++ templates language-lawyer typedef

如果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>();
}

上面的代码对我(叮当声)有效,但是我想知道该标准是否有话要说。

1 个答案:

答案 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{