Поместите себя в положение компилятора: то, когда Вы вперед объявляете тип, весь компилятор знает, - то, что этот тип существует; это ничего не знает о своем размере, участниках или методах. Поэтому это звонило неполный тип . Поэтому Вы не можете использовать тип для объявления участника или базового класса, так как компилятор должен был бы знать расположение типа.
Принятие следующего предописания.
class X;
Вот то, что Вы можете и не можете сделать.
, Что можно сделать с неполным типом:
Объявляют, что участник указатель или ссылка на неполный тип:
class Foo {
X *p;
X &r;
};
Объявляют функции или методы, которые принимают/возвращают неполные типы:
void f1(X);
X f2();
Определяют функции или методы, которые принимают/возвращают указатели/ссылки на неполный тип (но не используя его участников):
void f3(X*, X&) {}
X& f4() {}
X* f5() {}
, Что Вы не можете сделать с неполным типом:
Использование это как Использование базового класса
class Foo : X {} // compiler error!
это для объявления участника:
class Foo {
X m; // compiler error!
};
Определяют функции или методы с помощью этого Использования типа
void f1(X x) {} // compiler error!
X f2() {} // compiler error!
его методы или поля, на самом деле пытаясь разыменовать переменную с неполным типом
class Foo {
X *m;
void method()
{
m->someMethod(); // compiler error!
int i = m->someField; // compiler error!
}
};
Когда дело доходит до шаблонов, нет никакого абсолютного правила: можно ли использовать неполный тип, поскольку шаблонный параметр зависит от пути, тип используется в шаблоне.
, Например, std::vector
требует, чтобы его параметр был полным типом, в то время как boost::container::vector
не делает. Иногда, полный тип требуется, только если Вы используете определенные функции членства; дело обстоит так для [1 110] , например.
А хорошо зарегистрированный шаблон должен указать в его документации на все требования своих параметров, включая то, должны ли они быть полными типами или нет.
Я удивлен, что для компиляции 60 тыс. Строк кода требуется 2 минуты. У меня есть приложение, состоящее из 500 000 строк кода, и оно занимает всего полторы минуты. Убедитесь, что вы не выполняете полную перестройку каждый раз, и убедитесь, что вы не очищаете раствор между сборками. Нормальная сборка должна выполнять инкрементную сборку,
Вещи, которые увеличивают время компиляции:
Разделение вашего проекта на несколько проектов поможет. Только те проекты, в которых есть изменения (и проекты, которые от них зависят), потребуют перекомпиляции.
Однако единое пространство имен не должно влиять на время компиляции. Однако, если вы разделите свой проект на несколько проектов / сборок, то одно пространство имен определенно не лучшая идея.
Обновление до более быстрого процессора, вероятно, поможет, но вы можете обнаружить, что более быстрый ввод-вывод (лучше диски , RAID и т. Д. Будут более полезными).
И да, избегание длительного времени компиляции - одна из вещей, о которых разработчики должны позаботиться. Когда дело доходит до продуктивности, делайте все, что в ваших силах (лучшие инструменты, большие экраны, более быстрые машины и т. Д.)
Это поток об аппаратном обеспечении для сокращения времени компиляции. Также это действительно отличное сообщение в блоге Скотта Гатри, посвященное оценке производительности жесткого диска.