В std::queue<TreeNode*> q;
скобки заключают полное имя типа. (Под «именем» я подразумеваю весь декларатор для типа, TreeNode *
, а не идентификатор.) При описании типа с помощью декларатора используемая форма выглядит так, как будто полное нормальное объявление с идентификатором имеет свой идентификатор, удаленный. Например, начиная с объявления TreeNode *Placeholder
, имя типа: TreeNode *
.
В TreeNode* l = nullptr, r = nullptr;
нет скобок для группировки *
с TreeNode
. Согласно грамматике C ++, она сгруппирована с l
. Если бы здесь были разрешены скобки, чтобы мы могли написать <TypeNode *> l = nullptr, r = nullptr;
, то это могло бы сработать. Проблема здесь такая же, как если бы вы написали - a + b
: правила просты: -
сгруппирован с a
, поэтому выражение -a + b
, а не - (a + b)
.
Вы можете конечно обойти это с typedef TreeNode *TreeNodeP; TreeNodeP l = nullptr, r = nullptr;
. Это показывает, что эффекты являются просто результатами структурирования грамматики C ++ - нет никакой внутренней причины, по которой компилятор не может сначала принять любое описание типа, а затем список идентификаторов, которые должны быть объявлены с этим типом, но дизайн грамматики просто не делает поддержите это.
(Одним из следствий этого является ввод в заблуждение записи int* a
, поскольку близость токенов в тексте отличается от их близости в грамматике - *
ближе к int
в тексте, но ближе к a
в грамматике, поэтому интервал отправляет неверное сообщение.)