«Не удалось разрешить символ ‘map'» в пространстве имен

#c #eclipse #map #namespaces #eclipse-cdt

#c #eclipse #словарь #пространства имен #eclipse-cdt

Вопрос:

Привет!

В настоящее время я разрабатываю игровой движок. Несмотря на то, что я только начал, я уже столкнулся с проблемой.

У меня есть этот код:

 #ifndef INSTANS_H_
#define INSTANS_H_
#include <map>
#include "Core/Version.h"
#include "Core/Window.h"
#include "Core/Component.h"
#include "Core/Game.h"

namespace Instans
{
    class Window;
    class Component;

    class Engine
    {
    public:
        Engine();
        ~Engine();

        void AddComponent(char* name, Component* component, int priority = 10);
        void RemoveComponent(char* name);

        void SetFramerateLimit(int limit);

        int GetFramerate();
        int GetFramerateLimit();

        void Run(char* title, int width, int height);
        void Load();

        void Update();
        void Render();

        void Release();
    protected:
    private:
        Window* _window;

        // Game, managers etc.
        std::map<int, char*, Component*> _components;
    };
};
#endif
  

Несмотря на то, что я включил, Eclipse выдает следующую ошибку:

Не удалось разрешить символ ‘map’ Instans.h

В чем может быть причина?

Комментарии:

1. Зачем все эти указатели на неконстантные символы? Хммм….

2. Подозреваю, что вы ищете проблему с Eclipse, а не конкретно проблему с вашим кодом, C или std ::map

3. это была macOS?

4. Нет, это было в Windows еще в тот день.

Ответ №1:

Правильно указано имя ::std::map , поскольку вы уже находитесь в каком-то другом пространстве имен.

Комментарии:

1. Компилятор все равно должен перейти к внешним областям и найти его в глобальном, если map во внутреннем пространстве имен нет другого типа (и он не показан в вопросе).

2. @MarkB: трудно сказать, не зная всего содержимого пространства имен; учитывая, что это игровой движок, вполне вероятно, что где-то есть «карта» 🙂

3. Здравствуйте. Я не создал карту в своем пространстве имен. Я попытался использовать ::std::map , но столкнулся с той же ошибкой. Я также удалил «int». То, что я пытался сделать, добавляло приоритет для того, в каком порядке компоненты должны обновляться и отображаться.

4. @meth0d_: ХОРОШО. Сначала попробуйте без третьего параметра и посмотрите, работает ли это; затем перейдите и напишите правильную функцию сравнения, которая реализует ваш порядок.

5. @KerrekSB: теперь это выглядит так: std::map<int, std::pair<char*, Component*>> _components; , но я все еще получаю ту же ошибку, также на std::pair сейчас.

Ответ №2:

Третий параметр map — это тип функции сравнения, а не третий тип данных. Скорее всего, именно это и является причиной вашей проблемы.

Я не могу точно сказать, что вы пытаетесь сделать, но если вы пытаетесь сопоставить составной ключ int / string с компонентом, который вы могли бы использовать:

std::map<std::pair<int, std::string>, Component*>

Ответ №3:

Третьим параметром шаблона для сопоставления должна быть функция сравнения. Я предполагаю, что вы пытаетесь отобразить из int -> (char *, Component ). Вам нужно будет обернуть символ и компонент * в структуру или пару…

 typedef std::pair<char*, Component*> CharAndComponentPair;
typedef std::map<int, CharAndComponentPair> ComponentMap;

ComponentMap _components;
  

Ответ №4:

Если это проблема Eclipse, а не проблема компиляции, то проблема заключается в том, что существует множество включенных каталогов, которые отсутствуют с точки зрения индексаторов.

Добавление следующего сработало для меня, но может зависеть от вашей конкретной настройки, где они действительно существуют:

 /usr/include/c  /4.6.1
/usr/include/                
/usr/include/c               
/usr/include/c  /4.6         
/usr/include/x86_64-linux-gnu
/usr/include/asm-generic
/usr/include/c  /4.6.1/x86_64-linux-gnu/
  

Они могут быть установлены в Project>Properties>C Include Paths

Комментарии:

1. Пути включения хороши. #include <map> обработан нормально. Но по какой-то причине все еще не удается проанализировать использование std::map.

Ответ №5:

Если вы установили плагин CDT для eclipse, все должно работать «из коробки». Я попытался объявить вектор, но когда дело дошло до его создания, он выдал ту же неразрешенную ошибку символа. Проверяя форумы CDT, я обнаружил, что иногда срабатывало просто превращение ошибок в предупреждения. Поэтому я просто проигнорировал ошибки компиляции и запустил проект. Это сработало.

 #include <vector>     // this was fine.  no complaints from eclipse

int main() {

std::vector V;        ///  vector was underlined red.  Just ignore and run.
V.push_back(1);

return 0;
}
  

Комментарии:

1. Это хорошо с вектором, набором и т. Д. Это зависит от карты. Я вижу ту же проблему в macOS

Ответ №6:

 #include <map>
using namespace std;
map<string, SDL_Texture* > m_textureMap;
  

http://www.cplusplus.com/reference/map/map/map/