Почему не может предописание использоваться для станд.:: вектор?

Замена события (click) на (mousedown) должна помочь вам:

dont blur (click me)

Forked Stackblitz

24
задан Orion Edwards 1 September 2008 в 02:14
поделиться

6 ответов

Компилятор должен знать, как большой "B" - прежде чем это сможет генерировать соответствующую информацию макета. Если бы вместо этого, Вы сказали std::vector<B*>, то компилятор не должен был бы знать, как большой B - то, потому что это знает, насколько большой указатель.

28
ответ дан 28 November 2019 в 22:59
поделиться

Фактически ваш пример будет построен, если конструктор A будет реализован в модуле компиляции, который знает тип B.

Экземпляр std :: vector имеет фиксированный размер, независимо от того, что такое T, поскольку он содержит, как уже говорили другие, только указатель на T. Но конструктор вектора зависит от конкретного типа. Ваш пример не компилируется, потому что A () пытается вызвать вектор ctor, который не может быть сгенерирован без знания B. Вот что будет работать:

Объявление A:

// A.h
#include <vector>

class B; // Forward declaration.

class A
{
public:
    A(); // only declare, don't implement here

private:
    std::vector<B> v;
};

Реализация A:

// A.cpp
#include "A.h"
#include "B.h"

A::A() // this implicitly calls vector<B>'s constructor
{
    std::cout << v.size() << std::endl;
}

Теперь пользователю A нужно знать только A, а не B:

// main.cpp
#include "A.h"

int main()
{
    A a; // compiles OK
}
24
ответ дан 28 November 2019 в 22:59
поделиться

Инстанцировать A:: v, компилятор должен знать конкретный тип B.

, При попытке минимизировать сумму #included багажа для улучшения времени компиляции, существует две вещи, которые можно сделать, которые являются действительно изменениями друг друга:

  1. Использование указатель на Использование B
  2. легкий вес прокси к B
5
ответ дан 28 November 2019 в 22:59
поделиться

Это - больше, чем просто размер B, это необходимо. Современные компиляторы будут иметь необычные приемы для ускорения векторных копий с помощью memcpy, если это возможно, например. Это обычно достигается путем неравнодушной специализации на мысе POD типа элемента. Вы не можете сказать, является ли B POD из предописания.

3
ответ дан 28 November 2019 в 22:59
поделиться

Это не имеет значения, используете ли Вы вектор или просто пытаетесь инстанцировать одного B. Инстанцирование требует полного определения объекта.

1
ответ дан 28 November 2019 в 22:59
поделиться

Причина, по которой вы не можете использовать предварительную декларацию, заключается в том, что размер B неизвестен.

В вашем примере нет причины, по которой вы не можете включить Bh внутри Ah, так какую проблему вы действительно пытаетесь решить?

Редактировать: Есть еще один способ решить эту проблему проблема тоже: прекратите использовать C / C ++! Это так 1970-х годов ...;)

-8
ответ дан 28 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: