Почему это объявление класса не работает в Visual Studio - PullRequest
6 голосов
/ 10 июня 2010

Поэтому я пытаюсь получить некоторый код, написанный для 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'

Однако, когда я пытаюсь это сделать с помощью std :: vector, он прекрасно компилируется:

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

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

Ответы [ 3 ]

7 голосов
/ 10 июня 2010

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

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

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

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

5 голосов
/ 10 июня 2010

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

1 голос
/ 10 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...