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

问题描述 投票:3回答:1

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

上面的代码适合我(clang),但我想知道标准是否有任何关于它的说法。

c++ templates language-lawyer typedef
1个回答
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{
© www.soinside.com 2019 - 2024. All rights reserved.