Шаблоны: мне нужно изучить их лучше?Почему я получаю ошибки - PullRequest
0 голосов
/ 03 мая 2011

Я работаю над чьим-либо другим кодом, которого больше нет, и он является старым CodeWarrior Code. XCode жалуется на это:

template <class listClass,class itemClass>
void FxStreamingObjectList<listClass,itemClass>::StreamOut(FxStream *stream)
{
    if (listClass::size())
    {
        stream->PutSeparator();
        stream->PutString(mFieldName.c_str());
        stream->PutSeparator();
        stream->PutBeginList();
        stream->Indent(+1);

        listClass::iterator iter;

        for (iter=listClass::begin(); iter != listClass::end(); iter++)
        {
            stream->PutSeparator();
            stream->PutString( (*iter)->GetClassID() );
        }

            (*iter)->StreamOut(stream);
        }
        stream->Indent(-1);
        stream->PutSeparator();
        stream->PutEndList();
        stream->PutSeparator();
}

}

Я получаю сообщения об ошибках listClass::iterator iter; и for (iter=listClass::begin(); iter != listClass::end(); iter++):

error: expected `;' before 'iter'
error: 'iter' was not declared in this scope

Другие места в том же .h, те же типы объявлений шаблонов, которые я получаю как:

error: dependent-name 'listClass::iterator' is parsed as a non-type, but instantiation yields a type

на:

for (listClass::iterator iter=listClass::begin(); iter != listClass::end(); iter++)

Как мне решить эти ошибки? Я не очень хорошо знаю шаблоны, так что я запутался и не уверен, с чего начать. Хороший шаблонный ресурс также приветствуется.

Ответы [ 3 ]

5 голосов
/ 03 мая 2011

Компилятор не узнает чуть позже в процессе синтаксического анализа, что конкретное listClass для любого конкретного экземпляра FxStreamingObjectList<listClass, itemClass> имеет тип члена, называемый iterator.Поэтому имя iterator является «зависимым именем».

Вы должны указать компилятору, которого вы ожидаете / требуете iterator, чтобы быть типом, с typenameключевое слово:

typename listClass::iterator iter;

и:

for (typename listClass::iterator it = listClass::begin(), end = listClass::end(); it != end; ++it)

(Кстати, begin() и end() действительно статические функции-члены?)

Просто еще одна причуда C ++.:)

1 голос
/ 03 мая 2011

На другие ответы уже дан ответ Почему ошибка
Что касается второй части вашего вопроса: Хороший ресурс шаблона также приветствуется

Самая определенная книга по шаблонам C ++:
Шаблоны C ++: Полное руководство Дэвид Вандеворде и Николай Йосуттис

1 голос
/ 03 мая 2011

Официально C ++ не знает, являются ли зависимые символы типами или нет. Для вас программист listClass::iterator - это, очевидно, тип. Компилятору нужна помощь.

Определение iter должно быть:

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