Всем доброго времени суток.
Есть хедер, в котором я юзаю std::vector в качестве параметра к функции. И в нём есть что-то вроде:
#include "Somefile.h" // ...
И другой файл выглядит так:
// somefile.h #include <Windows.h> #include <vector> // ...
Так вот он мне ругается: "error C2039: 'vector' : is not a member of 'std'".
Если я сделаю так:
#include "somefile.h" #include <vector>
то всё работает. Не пойму почему. Я начал изучать это дело, сгенерил листинги, поставил всякие ключи(ShowIncludes) дабы убедиться что файл <vector> действительно включается. И убедился в этом. Но ошибка есть и я не могу понять, что послужило тому причиной.
Есть какие-нить мысли ?
Заранее благодарю.
Gladiator
В начале заголовочных файлов используй:
#pragma onces3dworld
я использую комбинацию #ifndef.. #define
ОК, покажу более конкретней:
1. Файл, в котором не видится вектор:
#ifndef I_RESOURCE_MANAGER_H #define I_RESOURCE_MANAGER_H #include "IBaseResourceLoader.h" //#include <vector> class IResourceManager { public: // регистрируем загрузчик и указываем файлы с какими расширениями будут грузиться используя этот загрузчик. virtual engBool RegisterResourceLoader(IBaseResourceLoader* m_pLoader, const std::vector<engString>& extensions) = 0; virtual engBool UnregisterResourceLoader( IBaseResourceLoader* m_pLoader) = 0; // ...
2. IBaseResourceLoader
#ifndef IBASERESOURCELOADER_H #define IBASERESOURCELOADER_H #include "definitions.h" // Наследуйтесь от этого класса чтобы создать свой собственный загрузчик class IBaseResourceLoader { public: virtual engVoid* LoadResource(const engString& name) = 0; virtual engBool UnloadResource( engVoid* pRes) = 0; }; #endif
3. definitions.h
#ifndef DEFINITIONS_H #define DEFINITIONS_H #ifdef WIN32 #include <Windows.h> #include <string> #include <vector> //#include <map> //#include <list> // ...
А у тебя WIN32 то определено где-нибудь?
Crazy Hamster
да, в проекте
Gladiator
а #endif есть? =)
Зачем инклюдить везде windows.h ? %)
Ошибка найдена.. Ошибка проектирования. Так или иначе всем откликнувшимся спасибо!
Gladiator
> #include "somefile.h"
> #include <vector>
поменяй местами
я бы на месте тс использовал precompiled headers либо просто вынес все заголовочные файлы стандартной библиотеки в отдельный заголовочный файл.
cranky
> я бы на месте тс использовал precompiled headers
поддерживаю
Понатыкают инклюдов где попало, потом жалуются что компиляция долгая :)
В *.h не должно быть инклюдов вообще (кроме одного, на основе которого создается precompiled header).
Инклюдить лучше в cpp файле.
у него вектор определяется после того как используется, то что я предложил должно пофиксить проблему без лишней головной боли.
> у него вектор определяется после того как используется, то что я предложил должно пофиксить проблему без лишней головной боли.
Тут надо бы пояснить ж:
#ifdef WIN32Если собираем не под виндой/хитрожопым компилером, в строки далече мы не попадаем
Или у автора другая ошибка?
Тема в архиве.
| Картинки по запросу металлический очаг для костра Картинки по запросу металлический очаг для костра. gorynich.ru |