Видимость вложенного класса C ++ Полное определение в присутствии прямых объявлений [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Видимость вложенного класса C ++ Полное определение в присутствии прямых объявлений [дубликат]

Сообщение Anonymous »

В C ++, прямое объявления представляют неполный тип. Неполные типы могут использоваться для объявления указателей, но их нельзя использовать для инициализации значений или доступа к членам, поскольку полное определение не было дано. Рассмотрим следующий рабочий пример: < /p>

Код: Выделить всё

struct C { // #1
// Forward declaration only
struct A; // #2
struct B {
// Pointer declaration is allowed with incomplete type
A* a;

int foo() {
// Member requires complete definition of A
return a->value;
}
};

// Complete definition of A given after B
struct A {
int value;
};

// Members and constructor
A a; B b;
C(int x) : a{x}, b{&a} {}
};

int main() {
C c{42};
return c.b.foo(); // returns 42
}
< /code>
Этот фрагмент успешно компилируется с G ++ и Clang. По -видимому, любой настройка приводит к тому, что этот «вперед смотрящий» ссылается на полное определение struct a 
для снятия. Удаление прямого объявления полностью (т.е. удаление #2 ) дает «Имя неизвестного типа» a 'error.
Это не теоретическая проблема: открытая библиотека планирования движения, важная библиотека робототехники, использует этот шаблон в нескольких местах для определения компараторов для приоритета. (Поиск репо для MotionCompare , чтобы увидеть более полные примеры).
Итак, вопрос: Почему эта компиляция? Изменилась ли обоснованность этой конструкции по мере развития языкового стандарта? В частности, оба нельзя идентифицировать как дубликаты, не зная ответа. Этот вопрос о явной форвардной заявлении об классе братьев и сестер; Другой посвящен неявному заявлению о родительском классе. Тот факт, что одинаковые правила поиска имени применимы к обеим ситуациям, не был очевиден. Кроме того, поскольку другой вопрос явно не ссылается на занятия вперед или сестер, вряд ли он обнаружит кого-то, кто ищет ответ в этих случаях.

Подробнее здесь: https://stackoverflow.com/questions/797 ... forward-de
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»