Ошибка в шаблоне: итератор не был объявлен в области видимости - PullRequest
3 голосов
/ 03 октября 2011

пытаюсь сделать шаблон, но у меня ошибка в gcc4, а не в VS2008.Это код, который завершается ошибкой:

#pragma once
#ifndef _ZELESTE_ZEL_GPX_GENERALMANAGER_H_
#define _ZELESTE_ZEL_GPX_GENERALMANAGER_H_

#include "../internal/cuCoreLib.h"
#include "boost/functional/hash.hpp"
#include "boost/ptr_container/ptr_map.hpp"

namespace z3d{
    namespace core{
        template<class Key, class Value>
        class cuManager
        {
            boost::ptr_map<Key, Value> m_ItemMap;

        public:
            /**
            * Default constructor
            */
            cuManager(void){}

            /**
            * Get a vector that contain the keys of the elements contained in the manager.
            * @return an const std::vector of type Key 
            */
            const std::vector<Key> getKeys()
            {
                    boost::ptr_map<Key,Value>::iterator itr = m_ItemMap.begin();
                    std::vector<Key> v;
                    while(itr != m_ItemMap.end())
                    {
                            v.push_back(itr->first);
                            ++itr;
                    }
                    return v;
            }

          }
        };
    };

Это один из методов, который не удается скомпилировать (все методы класса не выполняются в одном итераторе).Этот код прекрасно работает в Visual Studio, но компиляция в GCC возвращает эту ошибку:

/home/dev001/desarrollo/code/lpgameengine/LPGameEngine/src/core/datatypes/cuManager.h: In member function ‘const std::vector<_Tp, std::allocator<_CharT> > z3d::core::cuManager<Key, Value>::getKeys()’:
/home/dev001/desarrollo/code/lpgameengine/LPGameEngine/src/core/datatypes/cuManager.h:28: error: expected ‘;’ before ‘itr’
/home/dev001/desarrollo/code/lpgameengine/LPGameEngine/src/core/datatypes/cuManager.h:30: error: ‘itr’ was not declared in this scope

Любая помощь будет приветствоваться

1 Ответ

6 голосов
/ 03 октября 2011

Объявите это так:

typename boost::ptr_map<Key,Value>::iterator itr = m_ItemMap.begin();
^^^^^^^^

Дело в том, что boost::ptr_map<Key,Value>::iterator является зависимым именем , поэтому вы должны указать, что это имя типа (а не имя переменной или шаблона).

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