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

Поиск:

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


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


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

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



Есть класс MethodContainer являющийся шаблоном с одним параметром.
Код
template <class T> class MethodContainer
Этот класс находится в файлах MethodContainer.cpp и MethodContainer.h.
Два других класса ScriptClass и ScriptEngine наследуются от него и находятся в файлах с соответствующими именами (вообще у меня все классы раскиданы по разным файлам, всего классов пока 9 и они довольно много общаются друг с другом).
Код
class ScriptEngine: public MethodContainer<StaticMethod>
и
Код
class ScriptClass: public MethodContainer<scriptMethod>
Оба производных класса должны вызывать методу друг-друга.
Так вот я сначала задолбался расставлять #include, т.к. при некоторых комбинациях компилиться не хотело вообще с какими-то бредовыми сообщениями об ошибках.
А теперь компилится, а на этапе линковки ругается на все методы из MethodCaller как unresolved externals.
Это в VS2002. Пробовал в Visual C++ 6.0 тот вообще с ума сходит -- выдаёт ошибку за ошибкой, причём в STL классах smile.gif. Попробовал в C++ Builder 6.0 -- там откомпилировалось и слинковалось без проблем.

Ещё. Выкинул оба пронаследованных класса и добавил один класс Test
Код
class Test: public MethodContainer<int>
Так ведь работает, сволочь!!!

Чувствую, что проблема в может быть в #include. Но какая?

ЗЫ: На Builder перейти не предлагать smile.gif

Это сообщение отредактировал(а) Дрон - 31.8.2004, 23:54


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


Шустрый
*


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

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



А какие ошибки с инклудами компилятор писал?

StaticMethod и scriptMethod - это классы?
PM   Вверх
Дрон
Дата 31.8.2004, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Да, классы.

Ошибки были не с инклудами, а внутри кода он не видел некоторых типов, хотя соответствующий инклуд был.

Вот, например, если добавить в sciptengine.h инклуд scriptable.h
То в файле scriptclass.cpp вылазит, что "'Fields' is not a member of 'Scriptable'" что есть полнейший бред sad.gif
Кроме того он "забывает" класс Variable и т.д.

Это сообщение отредактировал(а) Дрон - 31.8.2004, 22:19


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


Шустрый
*


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

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



вышли мне свой код на bigman777<sobaka>rambler.ru Я посмотрю и попытаюсь ченить решить, а то я так ни хрена не въежаю smile.gif
PM   Вверх
Дрон
Дата 31.8.2004, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ok! Выслал.

Мож, конечно, я просто где-то жутко стормозил... Но почему же в Борланде работает???


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


Шустрый
*


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

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



Линкер пишет, что нет реализации GetMethod в ScriptMethod (модуль ScriptClass). Копай в эту сторону, что то ты явно перемудрил с ООП smile.gif. А все остальное это куча warning, неплохо было бы и их тож просмотреть и поискать что к чему. Правда если компилить проект в Release то они исчезают и не мозолят глаза. smile.gif
Добавлено @ 00:14
Вобщем закоментировал все строки где вызывается GetMethod и получил вот это:
Цитата
error LNK2001: unresolved external symbol "public: virtual __thiscall MethodContainer<class ScriptMethod>::~MethodContainer<class ScriptMethod>(void)" (??1?$MethodContainer@VScriptMethod@@@@UAE@XZ)


Это сообщение отредактировал(а) Manve - 1.9.2004, 00:05
PM   Вверх
Manve
Дата 1.9.2004, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



То что компидятор ругается на STL в debug режиме - это он тебя предупреждает что он обрезает все названия переменных до 255 символов (во дибил тама таких имен даже нету smile.gif(или я плохо искал biggrin.gif)), так что можешь забить на STL. smile.gif
PM   Вверх
Manve
Дата 1.9.2004, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Усе, я твой код откомпилил, просто закоментировав вызовы функции GetMethod в модуле ScritpClass и убрал деструктор в классе MethodContainer. smile.gif Ты явно что-то переборщил с ООП. smile.gif Пробуй разобраться сначала с деструктором, а потом с GetMethod.
Цитата
Попробовал в C++ Builder 6.0 -- там откомпилировалось и слинковалось без проблем.

Может там есть свои какие-то свои фички работы с классами. smile.gif
PM   Вверх
chipset
Дата 1.9.2004, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Дрон
Можешь мне тоже выслать плз, поломаю голову?
chipset3 hehe.gif mail.ru

Это сообщение отредактировал(а) chipset - 1.9.2004, 06:53


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Дрон
Дата 1.9.2004, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Manve @ 1.9.2004, 01:37)
Усе, я твой код откомпилил, просто закоментировав вызовы функции GetMethod в модуле ScritpClass и убрал деструктор в классе MethodContainer.  Ты явно что-то переборщил с ООП.  Пробуй разобраться сначала с деструктором, а потом с GetMethod.

Ну я так тоже могу smile.gif А насчёт "переборщил с ООП" -- смешно звучит smile.gif
В крайнем случае хрен с ним: сделаю без шаблона, боюсь только как бы потом опять ещё чего-нибудь не вылезло.

chipset
Всё. Отправил.


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


Эксперт
****


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

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



ну и мне за компанию smile.gif (мыло в профайле)


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


Эксперт
****


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

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



Цитата
Есть класс MethodContainer являющийся шаблоном с одним параметром. Код template <class T> class MethodContainer Этот класс находится в файлах MethodContainer.cpp и MethodContainer.h.

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

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


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


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

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



Цитата(DENNN @ 1.9.2004, 11:40)
Сколько раз уже было сказано, что при создании шаблона весь код должен находится в заголовочном файле

Пробовал sad.gif
Начинает ругаться на всё подряд.
Например:
Код
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");
}

Пишет:
type 'int' unexpected
'i' undeclared identifier
'iterator' undeclared identifier
'pair' undeclared identifier
и т.д.

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

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


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


Опытный
**


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

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



Цитата
pair<string_t,int>(*i).second

А что это вообще такое? Здесь, насколько я понимаю ты создаёшь класс std::pair<string,int>. В конструкторе должно быть два аргумента pair<string,int>("wer",10);
Иля ты итератор пытаешься к pair преобразовать? Тебе, наверное, надо просто i->second. Как у тебя MethodsMap объявлен?
PM MAIL ICQ   Вверх
DENNN
Дата 1.9.2004, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



тогда уж make_pair использовать.

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

PM ICQ   Вверх
Дрон
Дата 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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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