Допустимо ли размещать typedef внутри класса, который использует сам класс в качестве параметра шаблона? - PullRequest
0 голосов
/ 14 февраля 2019

Есть ли какие-либо подводные камни для помещения 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), но мне было интересно,в стандарте было что сказать об этом.

1 Ответ

0 голосов
/ 14 февраля 2019

typedef внутри Foo класса - это объявление и , а не определение , поэтому разрешено делать то, что вы делаете.Если бы это было определение, оно не было бы разрешено, потому что определение класса Foo не завершено до закрывающей скобки.

6.1 Объявления и определения [basic.def]

2 Объявление - это определение , если только
...

(2.9) - это объявление typedef (10.1.3),

Но если вы сделали что-то вроде этого:

class Foo{
  public:
    Foo f; //A definition
}

Foo f будет считаться определением, а компилятор выдаст ошибку нравится:

error: field has incomplete type 'Foo'
    Foo f;
        ^
<source>:1:7: note: definition of 'Foo' is not complete until the closing '}'
class Foo{
...