Почему это объявление класса не работает над Visual Studio

Таким образом, я пытаюсь получить некоторый код, который написан, чтобы gcc скомпилировал на Visual Studio 2008. У меня есть проблема, которую я сузил к этому:

class value_t
{
public:
  typedef std::deque<value_t>         sequence_t;
  typedef sequence_t::iterator        iterator;
};

Этот код сбои:

1>cpptest.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t'
1>        c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t'
1>        c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled
1>        with
1>        [
1>            _Ty=value_t
1>        ]
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t'
1>        c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t'

Однако, когда я пробую это станд.:: вектор, это компилирует прекрасный:

class value_t
{
public:
  typedef std::vector<value_t>        sequence_t;
  typedef sequence_t::iterator        iterator;
};

Что случилось? Я попытался добавить 'имя типа' везде, я могу думать, но в данный момент я думаю, что это - просто ошибка в STL Dinkumware. Кто-либо может объяснить, что происходит, и/или предложите решение?Спасибо.

6
задан Roel 10 June 2010 в 18:41
поделиться

3 ответа

Неопределенное поведение. См. эту ссылку на c.l.c ++. Moderated

Отрывок из ответа Дэниела К. -

стандарт C ++ (как C ++ 03, так и C ++ 0x) говорит, что вы пытаетесь вызывает неопределенное поведение, см. [lib.res.on.functions] / 2:

«В частности, эффекты undefined в следующих случаях: [..] - если неполный тип (3.9) используется в качестве аргумента шаблона, когда создание экземпляра компонента шаблона. "

7
ответ дан 8 December 2019 в 18:32
поделиться

Я думаю, что проблема в том, что value_t является неполным типом до конца определения. Попытка использовать неполный тип в качестве параметра шаблона для стандартного контейнера на самом деле не должна работать. Это может/будет работать при некоторых обстоятельствах, но если бы это не сработало со всеми стандартными типами контейнеров, это все равно не сигнализировало бы о какой-то ошибке. Стандарт требует, чтобы это был полный тип, так что если это не так, вы получите то, что получите - вероятно, он должен постоянно работать, но если он случайно работает, в этом нет ничего плохого.

5
ответ дан 8 December 2019 в 18:32
поделиться

Вы пытаетесь использовать класс внутри себя в шаблоне.Как это решить? Не знаю, пробовал ли я когда-нибудь это сделать, но возможно ли это вообще? Я не знаю, почему это работает для std :: vector, но я предполагаю, что это неправильно. Вы определяете класс и используете это определение в определении. Мне это кажется неправильным. Удачи в этом вопросе, мне самому будет интересно увидеть более глубокие ответы ...

1
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: