Неполные типы не могут быть созданы, а абстрактные классы (то есть классы с чисто виртуальными функциями-членами) также не могут быть созданы.
struct incomplete_type;
struct abstract_class
{
virtual void foo() = 0;
};
Случайно, сами абстрактные классы считаются неполные типы?
Внешне они похожи (за исключением того факта, что у абстрактных классов есть определения, а у неполных типов нет):
[n3690: 3.9/5]:
[..] Объекты не должны быть определены, чтобы иметь неполный тип.
[n3690: 10.4/2]:
Абстрактный класс — это класс, который может использоваться только как базовый класс какого-либо другого класса; никакие объекты абстрактного класса не могут быть созданы, кроме как подобъекты класса, производного от него. [..]
[n3690: 10.4/3]:
Абстрактный класс не должен использоваться как тип параметра, как тип возвращаемого значения функции или как тип явного преобразования. Указатели и ссылки на абстрактный класс могут быть объявлены.
Однако на самом деле стандарт проясняет, что эти два понятия не связаны:
[n3690: 3.9/5]:
Класс, который был объявлен, но не определен, тип перечисления в определенных контекстах (7.2) или массив неизвестного размера или неполного типа элемента, является не полностью определенным типом объекта. Не полностью определенные типы объектов и типы пустот неполные типы (3.9.1). Объекты не должны быть определены, чтобы иметь неполный тип.
Ваш абстрактный класс имеет определение, и поэтому не может рассматриваться как неполный тип.
N3690 — проект комитета C ++ 14.
Других решений пока нет …