Функция шаблона члена.Почему это не компилируется? - PullRequest
2 голосов
/ 05 марта 2011

Я хочу перебрать функцию-член по списку. В этом примере кода я получаю сообщение об ошибке компилятора в for-line:

Ожидается; до этого он не объявлен, конец не объявлен.

Почему? Функция даже не используется в коде!

template <class T> bool Settings::saveSimpleList( QString k, const T & l ){
    //...
    for ( T::ConstIterator it = l.constBegin(), end =l.constEnd(); it != end; ++it )
    {
        QString itemValue = QVariant( *it ).toString();
        //...
    }

    return true;
}

Понятно, я что-то упускаю в шаблонном программировании. Спасибо за ваши подсказки!

Ответы [ 2 ]

7 голосов
/ 05 марта 2011

Сделайте следующее:

for (typename T::ConstIterator it = l.constBegin(), end =l.constEnd(); it != end; ++it )
{
    QString itemValue = QVariant( *it ).toString();
    //...
}

При записи T::ConstIterator компилятор может интерпретировать это как «статический член ConstIterator типа T» или как тип, определенный как ConstIterator typedef в типе T ".

Если ваше намерение является вторым, как здесь, вам нужно добавить typename, чтобы сообщить компилятору.

1 голос
/ 05 марта 2011

Компилятор не может знать, что T :: ConstIterator является типом (потому что он не знает, каким будет T). Вы можете указать это, добавив typename перед ним.

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