Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unresolved externals, VS 2002 
:(
    Опции темы
Дрон
Дата 1.9.2004, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Вот, короче, весь файл:
Код
#ifndef INCLUDED_METHODCONTAINERH
#define INCLUDED_METHODCONTAINERH

#include <vector>
#include <map>

#include "Common.h"

template <class T>
class MethodContainer
{
   typedef std::vector<T*>         MethodVec;
   typedef std::map<string_t,int>  MethodMap;

   MethodVec   Methods;
   MethodMap   MethodNames;
public:
   T* GetMethod(int Index);
   T* GetMethod(const string_t& Name);
   T* AddMethod(const string_t& Name, bool_t Overwrite = false);
   virtual ~MethodContainer();
};

template <class T>
T* MethodContainer<T>::GetMethod(int i)
{
   if(i<0 || i>Methods.size())
       throw EScrException("Invalid method index");
   return Methods[i];
}

template <class T>
T* MethodContainer<T>::GetMethod(const string_t& Name)
{
   MethodsMap::iterator i = MethodNames.find(Name);
   if(i != MethodNames.end())
   {
       return GetMethod(pair<string_t,int>(*i).second);
   }
   throw EScrException("Method not found");
}

template <class T>
T* MethodContainer<T>::AddMethod(const string_t& Name, bool_t Overwrite)
{
   MethodsMap::iterator i = MethodNames.find(Name);
   if(i != MethodNames.end())
   {
       if(Overwrite)
       {
           int k = pair<string_t,int>(*i).second;
           delete Methods[k];
           Methods[k] = new T();
           return Methods[k];
       } else throw("Method already exist");
   }
   else
   {
       T* ptr = new T();
       Methods.push_back( ptr );
       MethodNames.insert(MethodsMap::value_type(Name, Methods.size()));
       return ptr;
   }
}

template <class T>
MethodContainer<T>::~MethodContainer()
{
   for(unsigned i=0;i<Methods.size();i++)
       delete Methods[i];
   Methods.clear();
   MethodNames.clear();
}

#endif

В common.h определены такие вещи как bool_t, string_t и т.п.
А вот чего говорит компилятор:
Цитата
c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(27) : warning C4018: '>' : signed/unsigned mismatch

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(35) : error
C2653: 'MethodsMap' : is not a class or namespace name

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(35) : error
C2065: 'iterator' : undeclared identifier

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(35) : error
C2146: syntax error : missing ';' before identifier 'i'

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(35) : error
C2065: 'i' : undeclared identifier

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(36) : error
C2679: binary '!=' : no operator found which takes a right-hand operand of type 'std::_Tree<_Traits>::iterator' (or there is no acceptable conversion)

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(38) : error
C2065: 'pair' : undeclared identifier

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(38) : error
C2275: 'string_t' : illegal use of this type as an expression
        c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\Common.h(7) : see declaration of 'string_t'

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(38) : error
C2062: type 'int' unexpected

c:\Documents and Settings\Андрей\Мои документы\Visual Studio Projects\Scripts\MethodContainer.h(27) : warning C4018: '>' : signed/unsigned mismatch


Олег М
Так в примерах было написано smile.gif Я первый раз с STL чего-то пишу...
Добавлено @ 11:17

maxim1000
Чего-то на твой ящик отсылаться не хочет sad.gif

Это сообщение отредактировал(а) Дрон - 1.9.2004, 11:26


--------------------
Да. Именно так.
PM   Вверх
maxim1000
Дата 1.9.2004, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
А почему, кстати, всё надо в заголовочный?

потому, что шаблоны не компилируются...
компилируются только их специализации для каждого типа отдально


--------------------
qqq
PM WWW   Вверх
Дрон
Дата 1.9.2004, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(maxim1000 @ 1.9.2004, 12:34)
потому, что шаблоны не компилируются...
Понятно.

Это сообщение отредактировал(а) Дрон - 1.9.2004, 11:49


--------------------
Да. Именно так.
PM   Вверх
Дрон
Дата 1.9.2004, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Всё. Откомпилировалось.
Такого со мной ещё не было. Старею, видать smile.gif

У меня объявлен тип MethodMap, а потом я пишу MethodsMap (а VisualAssistX ещё и его как класс подсвечивает) sad.gif sad.gif sad.gif sad.gif
Это ж надо до такого дойти...

Олег_М
Ты, кстати, прав. Я ещё раз глянул пример -- действительно можно просто i->second.

Всем спасибо smile.gif

ЗЫ: А борланд, видать, хитрый компилятор -- он глянул, что я нигде не создаю объектов такого типа и не стал вообще с ними связываться smile.gif


--------------------
Да. Именно так.
PM   Вверх
Manve
Дата 1.9.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Цитата
А насчёт "переборщил с ООП" -- смешно звучит

Я в твоем коде толком не ковырялся (времени не было), потому и зделал такое нелепое предположение. withstupid.gif
PM   Вверх
mr.DUDA
Дата 3.9.2004, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Здесь может быть баг:

#ifndef INCLUDED_METHODCONTAINERH
#define INCLUDED_METHODCONTAINERH

константы препроцессора, которые начинаются не с символа подчёркивания, НЕ ВИДНЫ за пределами файла -- соответственно, такое "предохранение" от повторного инклюда при компиляции не срабатывает. Замени на:

#ifndef _INCLUDED_METHODCONTAINERH
#define _INCLUDED_METHODCONTAINERH



--------------------
user posted image
PM MAIL WWW   Вверх
maxim1000
Дата 3.9.2004, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
константы препроцессора, которые начинаются не с символа подчёркивания, НЕ ВИДНЫ за пределами файла -- соответственно, такое "предохранение" от повторного инклюда при компиляции не срабатывает

А защита делается только от повторного включения в ОДИН и тот же файл *.cpp. По сути после выполнения команды #include получается один большой файл, поэтому все #define'ы, которые сделаны в h-файле, будут выполнены уже в этом большом файле, а значит и видны в нем же
попробовал два раза подключить один и тот же h-файл - даже без подчеркивания защита от дублирования вроде бы работает (VC++6.0)


--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.