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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Когда Linker умывает руки... Помогите найти ошибку. 
:(
    Опции темы
Chaos A.D.
Дата 6.6.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Здравствуйте. Программирую я, значит, кое какой графический интерфейс, и использую VCL. После того, как я фактически реализовал то, что мне нужно, линкер отказывается связывать все в бинарник, мотивируя это тем, что, мол, не находит определения функции. Среда программирования - BCB 6. В проект включен файл, в котором определена эта функция. Помогите, в чем проблема? Вот код разных файлов. Если этого будет недостаточно, могу выложить несколько файлов целиком. А пока...

Код

/* Файл FrameManager.h */

template < class T >
struct DeleteAndNil
{
    static void Delete ( T &obj )
    { delete obj; obj = NULL; }
};

template < class T >
struct NoDelete
{
    static void Delete ( T obj )
    { return; }
};

//****************************************************************************
class FindFrameVariant {};
/* Пока только один тип фреймов... */
//****************************************************************************

template < template <class> class DeletePolicy >
class FrameManager : public DeletePolicy<TFrame*>
{
    public :
        virtual TFrame* Make( Classes::TComponent* Owner, TWinControl *Parent );
        virtual void Remove ( void ) = 0;

        // Make-функция. Её определения не видит линкер. А оно есть, см. дальше.
        static FrameManager<DeletePolicy>* MakeFrameManager( FindFrameVariant );
};


Код

/* Файл FrameManager.cpp */

template < template <class> class DeletePolicy >
class FindFrameManager : public DeletePolicy<TFindFrame*>
{
    private :
        static TFindFrame *frame;

    public :
        virtual TFrame* Make( Classes::TComponent* Owner, TWinControl *Parent )
        {
            TFindFrame* CurFrame = (frame) ? frame : new TFindFrame(Owner);
            frame = CurFrame;
            CurFrame->Parent = Parent;
            CurFrame->Show();
            CurFrame->ImgClose->OnClick = WantToClose;
        };

        virtual void Remove( void )
            { CurFrame->Hide(); CurFrame->Parent = NULL; Delete(frame); }

        // ... Пропущено несколько деталей без потери смысла
};

template <template <class> class DeletePolicy >
TFindFrame* FindFrameManager<DeletePolicy>::frame = NULL;

//****************************************************************************
/* На остуствие этой функции ругается линкер */
template <template <class> class DeletePolicy>
FrameManager<DeletePolicy>*
FrameManager<DeletePolicy>::MakeFrameManager( FindFrameVariant )
{
    return new SearchFrameManager<DeletePolicy>();
};


Код

/* Файл FrameFactory.h */
template < template <class> class DeletePolicy >
class FrameFactory
{
    public :
        // Тут всякие функции... Они сейчас нам не интересны, кроме одной:

        // Добавляем пару : Имя - представитель фрейма.
        void AddFrameManager( AnsiString Name, FrameManager<DeletePolicy>* FM );
        // Её реализация в файле FrameFactory.cpp
};



Код

/* Файл MainFormUnit */

__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner), FFactory(this, SidePanel)
{
    // ...
    FFactory.AddFrameManager( "SearchFrame",
        FrameManager<DeleteAndNil>::MakeFrameManager(FindFrameVariant()) );
    // ...
}


В чем же тут дело, коллеги smile?

--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Chaos A.D.
Дата 6.6.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Вот блин, как всегда, руки до книг доходят в последнюю очередь, уже после того, как всю штукатурку со стен головой облупишь. Оказывается, параметризованные функции могут быть использованы только в том же модуле трансляции, где они объявлены. А у меня специфика кода как раз подразумевала использование их в другом месте. Кто нибудь знает, как можно решить такую проблемку - у меня имеется несколько классов, наследуемых от TFrame. И мне нужно, чтобы их можно было создавать по имени. Я сделал что-то вроде гомоморфного интерфейса классов, которые рулят этими Frame-ами, и определил make-функцию (производящую функцию в другой терминологии). Что я не учел, так это то, что определение make-функций нельзя поместить в другом .cpp файле. Есть какие нибудь идеи, как оставить всю гибкость классов, которые создают мои фреймы, и их гомоморфный интерфейс, и при этом оставить их параметризованными?

Говоря простым русским языком, можно ли придумать альтернативу статическим функциям шаблонных классов?

Это сообщение отредактировал(а) Chaos A.D. - 6.6.2005, 15:49
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
srd
Дата 6.6.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Вынеси реализацию шаблонных фукнций в заголовочный файл.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Chaos A.D.
Дата 6.6.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Дело в том, что в заголовочном файле определен только общий интерфейс в виде виртуального класса. Все настоящие дела творятся в файле .cpp.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
srd
Дата 6.6.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Это ограничение шаблонов - их реализация должны быть в той же единице трансляции, что и их использование. Обычно с этом мирятся и выносят реализацию шаблонов в заголовочные файлы - посмотри, например, исходники библиотек шаблонов типа STL, ATL или WTL. Экспортируемые шаблоны, которые позволили бы избежать такое ограничение, Борладном не поддерживаются.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Chaos A.D.
Дата 6.6.2005, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



Юмор, да и только... Только что наткнулся в настройках борланда на опцию - "External Templates" smile. Жаль, что не уживаетяс с STL.
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
versus
Дата 7.6.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



>Экспортируемые шаблоны, которые позволили бы избежать такое ограничение, Борладном не поддерживаются
А они хоть кем-нибудь поддерживаются? GCC с ними тоже не дружит.
PM MAIL WWW   Вверх
srd
Дата 7.6.2005, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата
А они хоть кем-нибудь поддерживаются?

Comeau поддерживает. Борланд, Вижуал, GCC - нет. OpenWatcom назвать компилятором Си++ трудно, там какой-то древнегреческий диалект. Про остальные компиляторы - не знаю.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
ManiaK
Дата 7.6.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Любопытно как это они делают smile
Наверняка без потери скорости не обходится, а на кой такое надо.
PM MAIL WWW   Вверх
versus
Дата 7.6.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



> а на кой такое надо.
ну ясно на кой - чтобы конкуренты не увидели сурсов темплейтных определений.

PM MAIL WWW   Вверх
Void
Дата 7.6.2005, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(ManiaK @ 7.6.2005, 16:54)
Любопытно как это они делают smile

Насколько я понимаю, кодогенерация экспортируемых шаблонов откладывается на этап компоновки.
Цитата(ManiaK @ 7.6.2005, 16:54)
Наверняка без потери скорости не обходится, а на кой такое надо.

Дело не в потере скорости (которой, имхо, нет). Дело в том, что существующая реализация export templates - это полумера, потому что раздельной компиляции шаблонов как не было, так и нет. Просто мы избавляемся от необходимости определять шаблонный метод/класс в каждой единице трансляции.

Цитата(versus @ 7.6.2005, 19:56)
ну ясно на кой - чтобы конкуренты не увидели сурсов темплейтных определений.

Цитата
The sources containing the exported template definitions must therefore be made available at the time of instantiation (usually, when prelinking is done). [...] Note that the export facility is not a mechanism for avoiding the publication of template definitions in source form.

http://www.comeaucomputing.com/4.0/docs/userman/export.html
Да даже если б можно было - толку, если всего один компилятор поддерживает эту возможность.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ManiaK
Дата 9.6.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Void проще говоря, это все лишь бутафория, а не экспорт?
PM MAIL WWW   Вверх
Void
Дата 10.6.2005, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(ManiaK @ 9.6.2005, 13:53)
Void проще говоря, это все лишь бутафория, а не экспорт?

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Chaos A.D.
Дата 11.6.2005, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

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



В специальном издании "Главной книги" от Страуструпа пишется, что экспортируемые шаблоны - реальность, причем включенная в стандарт. Даже ключевое слово есть - export. Почему то у меня книги - всегда последняя инстанция. Надо бы привыкать лезть туда в первую очередь.

Это сообщение отредактировал(а) Chaos A.D. - 11.6.2005, 23:06
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Fantasist
Дата 15.6.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата(Chaos @ 11.6.2005, 20:04)
В специальном издании "Главной книги" от Страуструпа пишется, что экспортируемые шаблоны - реальность, причем включенная в стандарт.


Да, в стандарт включена. Но возможно не надолго. Ибо реализация поддержки экспортируемых шаблонов в компиляторе ОЧЕНЬ трудоемка, а сама возможность экспортировать шаблоны не дает того, что от нее ожидается.






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


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

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