g++ -std=c++11
не скомпилирует класс, содержащий контейнер, содержащий уникальные указатели, указывающие на объявленный вперед класс. Вопросы:C++ 11 контейнер unique_ptr объявленного переднего класса
- Почему?
- Есть ли разумное решение?
Пример кода:
#include <vector>
#include <memory>
// variant 1 (with full class definition): compiles
class Bar { [..] };
using BarPtr = std::unique_ptr<Bar>;
// variant 2 (with shared instead of unique pointers): compiles
using BarPtr = std::shared_ptr<class Bar>;
// variant 0 (which is what we want): compilation fails below
using BarPtr = std::unique_ptr<class Bar>;
// end of variants
class Foo {
std::vector<BarPtr> vec;
public:
Foo() {} // compilation of variant 0 fails here:
// In instantiation of ‘void std::default_delete<Bar>::operator()(Bar*) const
// ...
// invalid application of ‘sizeof’ to incomplete type ‘Bar’
};
Я видел How to forward declare a class to be used in a standard container of unique_ptr и Is std::unique_ptr<T> required to know the full definition of T?, но не найти убедительные ответы на мои вопросы выше.
Я подтверждаю, что это скомпилировано под g ++. Программа 'main' не нужна. Однако реализация 'class Bar {[...]};' is. Таким образом, порядок в исходном файле не имеет значения. Тем не менее, я хочу реализовать класс 'Bar' в другом компиляторе. –
Да, главное, чтобы убедиться, что все в порядке. Если вы хотите перейти к объявлению вперед, вам нужно, наконец, реализовать класс где-то, чтобы не получить проблему с связыванием или, возможно, в вашей ошибке компиляции из-за отсутствия deleter (deconstructor) –