GCC может скомпилировать код ниже, но VS2010 express не смог:
#include <iostream>
#include <queue>
using namespace std;
struct A
{
deque<A>::iterator next;
};
int main()
{
A a;
}
Сообщение об ошибке:
ошибка C2027: использование неопределенного типа ‘A’ main.cpp (6): см. объявление ‘A’ main.cpp (7): см. ссылку на создание шаблона класса ‘std :: deque<_Ty> ‘компилируется 1> с 1> [1> _Ty = A 1>]
Есть ли способ решить эту проблему, кроме как с помощью указателей?
Как обсуждено, например, в Почему я могу использовать заранее объявленный класс в std :: vector?, создание экземпляров стандартных контейнеров с неполными типами — неопределенное поведение. Чтобы иметь возможность доступа к типу итератора std::deque<A>
требуется создать экземпляр этого класса, поэтому программа, которую вы передаете, имеет неопределенное поведение. В этом конкретном случае в gcc неопределенное поведение оказывается тем, что вы ожидаете, в то время как Visual Studio (с его реализацией стандартной библиотеки Dinkumware) не компилируется. Вполне вероятно, что Visual Studio ведет себя по-разному в режиме отладки и выпуска, так как в режиме отладки контейнеры (и итераторы) намного сложнее, чтобы можно было проверять многие злоупотребления итераторами.
Мне не удалось быстро найти ссылку, в которой указывается указатель на итератор deque, где тип элемента является неполным типом, и я боюсь, что, скорее всего, замена итератора указателем на итератор не сделает эту программу определенной ( хотя это может заставить его работать в большем количестве сред). Если вы должны были заменить итератор указателем: это обязательно сработает. Я не могу сказать вам, является ли это единственным решением, так как вы четко не указали, какую проблему вы пытаетесь решить. Возможно, существует другой подход к решению вашей проблемы, который не требует этой переменной-члена.