ПрограммированиеФорумОбщее

Проблема с хедерами STL

Страницы: 1 2 Следующая »
#0
17:29, 4 окт 2011

Всем доброго времени суток.
Есть хедер, в котором я юзаю 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> действительно включается. И убедился в этом. Но ошибка есть и я не могу понять, что послужило тому причиной.

Есть какие-нить мысли ? 

Заранее благодарю.

#1
17:34, 4 окт 2011

Gladiator
В начале заголовочных файлов используй:

#pragma once
#2
17:35, 4 окт 2011

s3dworld
я использую комбинацию #ifndef.. #define

#3
17:40, 4 окт 2011

ОК, покажу более конкретней:
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>
// ... 
#4
18:12, 4 окт 2011

А у тебя WIN32 то определено где-нибудь?

#5
18:13, 4 окт 2011

Crazy Hamster
да, в проекте

#6
18:44, 4 окт 2011

Gladiator
а #endif есть? =)
Зачем инклюдить везде windows.h ? %)

#7
19:15, 4 окт 2011

Ошибка найдена.. Ошибка проектирования. Так или иначе всем откликнувшимся спасибо!

#8
20:37, 4 окт 2011

Gladiator
> #include "somefile.h"
> #include <vector>
поменяй местами

#9
0:15, 5 окт 2011

я бы на месте тс использовал precompiled headers либо просто вынес все заголовочные файлы стандартной библиотеки в отдельный заголовочный файл.

#10
9:55, 5 окт 2011

cranky
> я бы на месте тс использовал precompiled headers

поддерживаю

#11
12:14, 5 окт 2011

Понатыкают инклюдов где попало, потом жалуются что компиляция долгая :)
В *.h не должно быть инклюдов вообще (кроме одного, на основе которого создается precompiled header).

#12
12:38, 5 окт 2011

Инклюдить лучше в cpp файле.

#13
15:51, 5 окт 2011

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

#14
20:56, 5 окт 2011

> у него вектор определяется после того как используется, то что я предложил должно пофиксить проблему без лишней головной боли.
Тут надо бы пояснить ж:

#ifdef WIN32

Если собираем не под виндой/хитрожопым компилером, в строки далече мы не попадаем

Или у автора другая ошибка?

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.