Каковы причины различий между диагностикой компилятора, когда он видит std :: vector <Typo>и std :: vector? - PullRequest
0 голосов
/ 31 января 2019

Рассмотрим эти две программы и их попытки компиляции.

#include <vector>

int main() {
    std::vector<struct Typo> a; // Errors centered around `Typo` being an incomplete type
}

gcc 6.3, например, выдает сообщения об ошибках с центром вокруг Typo, являющиеся неполными, включая

/usr/include/c++/6/bits/stl_vector.h:161:9: ошибка: недопустимое использование неполного типа 'struct main()::Typo'

#include <vector>

int main() {
    std::vector<Typo> b; // Errors centred around `Typo` not being defined
}

gcc 6.3, например, даетошибки вокруг Typo не определены, включая

prog.cpp: 4: 14: ошибка: ‘Typo’ не было объявлено в этой области

Оба вектораКонечно, создание экземпляров - это ошибки, но каково обоснование для различных диагностических сообщений, приведенных в комментариях к программе?

1 Ответ

0 голосов
/ 31 января 2019

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 - Зависит от того, какой у вас стандарткомпиляция и какие члены вектора вы используете.Добавлена ​​поддержка неполных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...