2009-06-04 2 views
0

Эй, все это, похоже, для меня это довольно странная проблема. У меня очень простой templatized контейнерный класс, который является частью DLL. Весь класс определяется в файле заголовка, чтобы разрешить автоматическое создание шаблонов. Теперь другая часть DLL фактически запрашивает определенный тип шаблона, который должен быть сгенерирован, поэтому код должен существовать в DLL. Однако при использовании объекта из другого исполняемого файла конструктор/деструктор, а также несколько других функций работают, однако 2 функции не найдены компоновщиком. Ниже приведен код этих двух функций, а также для рабочей функции.DLL экспортирует только определенные шаблонизированные функции

const T** getData() const 
{ 
    return m_data; 
} 

int getNumRows() const 
{ 
    return m_nRows; 
} 

int getNumCols() const 
{ 
    return m_nCols; 
} 

Так что getNumRows() и getNumCols() функции не найдены компоновщиком, функции, однако GetData() есть. Является ли это общей проблемой, нужны ли функции для параметра templatized для генерации?

@ 1 800 ИНФОРМАЦИЯ

Я экспортировал это из DLL с помощью стандартных макросов:

#ifdef ACORE_EXPORTS 
#define ACORE_API __declspec(dllexport) 
#else 
#define ACORE_API __declspec(dllimport) 
#endif 

И в определении класса:

template < class T > 
class ACORE_API matrix 

ответ

1

ли вы на самом деле экспорт функции из библиотеки? Вы должны указать имена в файле .def или использовать директивы dllexport и dllimport, чтобы выполнить это.

+0

Да, я полагаю, на это будет дан ответ, что некоторые функции работают. Но да, я использую макрос dllexport/dllimport для этого класса. – 2009-06-04 04:04:23

7

Компилятор будет генерировать только функции-члены, которые на самом деле вызываются.

Например:

template <class T> 
class MyClass 
{public: 
    int function1() 
    { 
     return 0; 
    } 
    int function2() 
    { 
     T t; 
     t->DoSomething(); 
     return 0; 
    } 
}; 

, а затем позже

MyClass<int> m; 
m.function1(); 

компилируется, потому что MyClass :: function2() никогда не был составлен.

Вы можете заставить экземпляр всего класса, делая это:

template class MyClass<int>; 

В этом случае каждый метод в классе будет экземпляр. В этом примере вы получаете ошибку компилятора.

+0

Спасибо, Йохан, кажется, сейчас очень просто хе-хе. Я вызывал одну (рабочую) функцию внутри DLL и, таким образом, генерировал ее, но не другие (нерабочие) функции. У меня создалось впечатление, что что-то вроде MyClass m; в любой момент, приведет к тому, что весь класс будет сгенерирован для int. – 2009-06-04 04:24:25

+0

Спасибо ... круто, это был мой первый раз, используя этот сайт. Это действительно хорошо вместе! –