Может ли кто-нибудь сказать мне, когда компилятор С++ выдает «ошибку неполного типа»?
Примечание. Я намеренно оставил этот вопрос немного открытым, чтобы я мог сам отлаживать свой код.
Может ли кто-нибудь сказать мне, когда компилятор С++ выдает «ошибку неполного типа»?
Примечание. Я намеренно оставил этот вопрос немного открытым, чтобы я мог сам отлаживать свой код.
Обычно это происходит, когда компилятор видел предварительное объявление, но не видел полного определения этого типа, в то время как этот тип где-то используется. Например:
class A;
class B { A a; };
Вторая строка вызовет ошибку компилятора и, в зависимости от компилятора, сообщит о неполном типе (другие компиляторы выдают другую ошибку, но смысл тот же).
Однако, когда вы просто используете указатель на такое предварительное объявление, никаких жалоб не возникнет, поскольку размер указателя на класс всегда известен. Так:
class A;
class B {
A *a;
std::shared_ptr<A> aPtr;
};
Если вы спросите, что может быть не так в конкретном приложении или библиотеке, когда возникает эта ошибка: обычно это происходит, когда включен заголовок, содержащий предварительное объявление, но полное определение еще не найдено. Решение вполне очевидное: включите также заголовок, который дает вам доступ к полному типу. Иногда вы также можете просто не использовать пространство имен или использовать неправильное пространство имен для типа, и вместо этого вам нужно исправить это.
Это происходит, когда мы пытаемся использовать класс/объект или его методы, которые еще не определены. Например
class A;
class B {
class A obj;
}
or
class A;
class B {
class A *obj;
B() {
obj->some_method();
}
Чтобы решить эту проблему, A должен быть определен первым или его полное объявление должно быть задано (лучше всего сделать это в заголовочном файле), а все методы обоих классов должны быть определены позже (лучше всего сделать это в другом файле). ).
class A {
//definition
}
class B {
class A obj;
}
В моем случае это произошло из-за плохого знания шаблонов. Я объявил класс между определением шаблона и функцией, связанной с этим шаблоном.
template<typename T>
class
{
foo a;
foo b;
};
function(T a,int b)
{
. . . . .
}
И это создало проблемы, так как определение шаблона связано с классом, в этом случае в списке параметров функции возникает ошибка T is not defined
, а также incomplete type is not allowed
. Если вам нужно использовать шаблон для нескольких сущностей, вы должны повторно использовать этот оператор перед определением этих сущностей:
template<typename T>
Это также происходит, когда вы используете предварительное объявление с std::unique_ptr
(например, для реализации идиомы PIMPL) в своем классе с деструктором по умолчанию, что приводит к такой проблеме.
Это хорошо объяснено здесь: Предварительное объявление с unique_ptr?