Объявление итератора std :: map вызывает странную ошибку - PullRequest
2 голосов
/ 14 мая 2011

Я просто пытаюсь объявить итератор карты, но я получаю сообщение об ошибке компиляции с надписью "ожидается; до этого"

Я полагаю, это потому, что я не включил все пространство имен std (используя пространство имен std;), но я намеренно не хочу включать все это.

Мой код:

#include <map>
#include <string>

template <class Object>
class Cont
{
    public:
       Cont() {}
       Object* get( unsigned int nID )
       {
           std::map <unsigned int, Object*>::iterator it = m.begin(); // error here "expected ; before it" what is this error?

           for ( ; it != m.end(); it++ ) 
           {
               if ( (*it).second->ID == nID ) { return (*it).second; }
           }

           return NULL;
       }

       std::map <unsigned int, Object*> m;
};

Я попробовал это также, но это не работает:

std::map <unsigned int, Object*>::std::iterator it = m.begin();

Ответы [ 3 ]

10 голосов
/ 14 мая 2011

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

typename std::map <unsigned int, Object*>::iterator it = m.begin();
1 голос
/ 14 мая 2011

Какой у тебя компилятор и настройки флага?Я смог построить это нормально.

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <map>
#include <string>

class Foo
{
public:
    int ID;
};

template <class Object> class Cont
{
    public:
       Cont() {}
       Object* get( unsigned int nID )
       {
           std::map <unsigned int, Object*>::iterator it = m.begin(); // error here "expected ; before it" what is this error?

           for ( ; it != m.end(); it++ ) 
           {
               if ( (*it).second->ID == nID ) { return (*it).second; }
           }

           return NULL;
       }

       std::map <unsigned int, Object*> m;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Cont<Foo> c;
    c.get( 2 );
    return 0;
}
0 голосов
/ 14 мая 2011

Вы не говорите, какой компилятор вы используете, но просто вырезав и вставив его в новый файл, он прекрасно компилируется в VS2010.Вам не нужно using namespace std;, конечно ....

(И ваша проблема с установкой другого итератора std :: before была творческой, но не правильной. :-) Вы указываете, чтоШаблон класса карты находится в пространстве имен std ::, а итератор - это тип, который вложен в шаблон карты.)

...