#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;