struct Typo
- подробный спецификатор типа.Это влияет на работу поиска имени.
[basic.lookup.elab]
2 : если уточненный спецификатор типане имеет спецификатора вложенного имени, и если подробный спецификатор типа не появляется в объявлении со следующей формой:
class-key attribute-specifier-seq identifier ;
идентификатор ищется в соответствии с [basic.lookup.unqual], но игнорируетсялюбые не типовые имена, которые были объявлены.Если уточненный спецификатор типа вводится с помощью ключевого слова enum, и этот поиск не находит ранее объявленное имя типа, то сложный спецификатор типа является некорректным.Если разработанный ключ типа вводится ключом класса и этот поиск не находит ранее объявленное имя типа, или если разработанный идентификатор типа появляется в объявлении в форме:
class-key attribute-specifier-seq identifier ;
уточненный спецификатор типа - это объявление, которое вводит имя класса, как описано в [basic.scope.pdecl].
То есть в std::vector<struct Typo> a;
, потому что struct Typo
не находитранее объявленный Typo
, он служит предварительным объявлением для типа.И, таким образом, это экземпляр вектора, который может 1 жаловаться на тип, который он получил, является неполным, потому что он попытается что-то с ним сделать.
В то время как в std::vector<Typo> b;
, глядя вверх Typo
ничего не находит.Для него нет предыдущей декларации, поэтому на данном этапе следует выдать диагностическое сообщение о том, что этот идентификатор необъявлен.
1 - Зависит от того, какой у вас стандарткомпиляция и какие члены вектора вы используете.Добавлена поддержка неполных типов.