Проблема с шаблонами
От: sergeymak http://sites.google.com/site/gamesoftdev/
Дата: 02.10.07 10:30
Оценка:
Никак не могу разрбраться с шаблонами. В проекте есть 2 модуля (2 DLL-ки). В первом модуле в неком .h файле имею:

#pragma once

#ifdef ENGINE_EXPORTS
#define ENGINE_API __declspec(dllexport)
#else
#define ENGINE_API __declspec(dllimport)
#endif

class ENGINE_API ResourceManager
{
public:

template< class T >
SmartPtr<T> GetResource(const string& name);    
};

template SmartPtr<SceneModel> ResourceManager::GetResource(const string& name);


далее из второго модуля вызываю:

ResourceManager* manager = ...
manager->GetResource<SceneModel>("bla-bla");


И при линкове получаю ошибку, что фунция не найдена (error LNK2001: unresolved external symbol). Хотя в первом модуле могу с этой функцией работать нормально. Кто-нибудь может объянить, в чем дело?
Re: Проблема с шаблонами
От: Аноним  
Дата: 02.10.07 10:32
Оценка:
Весь шаблон(включая реализацию) в хедер.
Re[2]: Проблема с шаблонами
От: sergeymak http://sites.google.com/site/gamesoftdev/
Дата: 02.10.07 10:40
Оценка:
А>Весь шаблон(включая реализацию) в хедер.

Предположим это действительно работает. Но у меня такая реализация нехилая, что ее в header ну очень не хочется запихивать.
Re[3]: Проблема с шаблонами
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 02.10.07 11:07
Оценка:
Здравствуйте, sergeymak, Вы писали:

А>>Весь шаблон(включая реализацию) в хедер.


S>Предположим это действительно работает. Но у меня такая реализация нехилая, что ее в header ну очень не хочется запихивать.


Ну тада выбирай, либо в хедер запихивать, лмбо от шаблона отказыватся.
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[3]: Проблема с шаблонами
От: Аноним  
Дата: 02.10.07 11:08
Оценка:
Здравствуйте, sergeymak, Вы писали:

А>>Весь шаблон(включая реализацию) в хедер.

S>Предположим это действительно работает. Но у меня такая реализация нехилая, что ее в header ну очень не хочется запихивать.
Предположим, что эта тема уже разжевана на форуме много раз и пользуемся поиском
Re: Проблема с шаблонами
От: LaptevVV Россия  
Дата: 02.10.07 12:30
Оценка:
Здравствуйте, sergeymak, Вы писали:

S>Никак не могу разрбраться с шаблонами.


S>И при линкове получаю ошибку, что фунция не найдена (error LNK2001: unresolved external symbol). Хотя в первом модуле могу с этой функцией работать нормально. Кто-нибудь может объянить, в чем дело?

Читай статью "Шаблоны и модули" здесь на форуме...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Проблема с шаблонами
От: Erop Россия  
Дата: 02.10.07 13:31
Оценка:
Здравствуйте, sergeymak, Вы писали:

А>>Весь шаблон(включая реализацию) в хедер.


S>Предположим это действительно работает. Но у меня такая реализация нехилая, что ее в header ну очень не хочется запихивать.


1) Это на самом деле работает, во всяком случае до тех пор, пока ты не начал указывать __declspec(dllimport/export)
2) По поводу нехилой реализации могу посоветовать написать нехилую нешаблонную реализацию, и к ней простой шаблонный интерфейс. После этого нешаблонную реализацию экспортишь, а интерфейс в хедеры...

Если подробнее опишешь задачу, то тебе скорее всего смогут дать более конкретный совет...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Проблема с шаблонами
От: sergeymak http://sites.google.com/site/gamesoftdev/
Дата: 02.10.07 16:35
Оценка:
Здравствуйте, Erop, Вы писали:

E>1) Это на самом деле работает, во всяком случае до тех пор, пока ты не начал указывать __declspec(dllimport/export)

Работает внутри первого модуля...

E>2) По поводу нехилой реализации могу посоветовать написать нехилую нешаблонную реализацию, и к ней простой шаблонный интерфейс. После этого нешаблонную реализацию экспортишь, а интерфейс в хедеры...

Да, я именно так уже и сделал. Правда не очень красивое решение получилось...
Re[2]: Проблема с шаблонами
От: sergeymak http://sites.google.com/site/gamesoftdev/
Дата: 03.10.07 07:51
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Читай статью "Шаблоны и модули" здесь на форуме...

Статью прочитал, но решения там не увидел. Может не заметил? Меня тут все упорно убеждают, что тема 10 раз обсуждалась, что решения красивого нет, что надо шаблон реализовывать в хедере... бррр... Оказалось надо всего лишь в моем коде строку
template SmartPtr<SceneModel> ResourceManager::GetResource(const string& name);
заменить на
template ENGINE_API SmartPtr<SceneModel> ResourceManager::GetResource(const string& name);
и все работает без всяких извращений. Удивителньо, что это мне здесь никто не подсказал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.