Странная ошибка компилятора, утверждающая, что мой итератор не определен - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь создать шаблонную функцию, которая будет перебирать определенные пары ключ / значение на карте и проверять, существуют ли какие-либо ключи, указанные в параметрах функции.

Реализация выглядит следующим образом:

Код

template < class Key, class Value >
bool CheckMapForExistingEntry( const std::map< Key, Value >& map, const std::string& key )
{
    std::map< Key, Value >::iterator it = map.lower_bound( key );
    bool keyExists = ( it != map.end && !( map.key_comp() ( key, it->first ) ) );
    if ( keyExists )
    {
        return true;
    }
    return false;
}

Тем не менее, по какой-то причине я не могу понять, почему мой код не скомпилируется. Вместо этого я получаю следующие ошибки:

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

Я сталкивался с этим раньше, но обычно это было из-за ошибок, которые я сделал, которые легко заметить. Что здесь может происходить?

1 Ответ

5 голосов
/ 28 января 2012

Уверен, вам нужен квалификатор typename:

template < class Key, class Value >
bool CheckMapForExistingEntry( const std::map< Key, Value >& map, const std::string& key )
{
    typename std::map< Key, Value >::iterator it = map.lower_bound( key );
    bool keyExists = ( it != map.end && !( map.key_comp() ( key, it->first ) ) );
    if ( keyExists )
    {
        return true;
    }
    return false;
}

Эта статья объясняет довольно подробно.

Фактически, компилятор знает, что потенциально может быть специализация std::map< Key, Value > для определенных значений Key и Value, которые могут содержать переменную static с именем iterator. Поэтому ему нужен квалификатор typename, чтобы убедиться, что вы на самом деле имеете в виду тип, а не какую-то предполагаемую статическую переменную.

...