Я попытался создать DLL, содержащую:

базовый класс шаблона , только с виртуальным деструктором и без атрибутов ( я назвал его MatrixInterface )

производный класс с конструкторами, деструктором, operator = и атрибутами ( матричный класс )

Функция, которая возвращает указатель базового класса на новый производный объект:

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

template<class T>
MatrixInterface<T> DLL_EXPORT * CreateMatrixInstance(unsigned int n,unsigned int m)
{
    return new matrix<T>(n,m);
}

Я хотел инсталлировать матричный класс в моей программе с помощью этой функции, но я не могу присвоить этой функции указатель на функцию, и я не понимаю, почему. Таким образом я могу загрузить любую функцию, не являющуюся функцией шаблона.

#include <windows.h>
#include <iostream>
using namespace std;

template<class T>
class MatrixInterface
{
public:
    virtual ~MatrixInterface(void);
};


typedef MatrixInterface<int>* (*Fptr)(unsigned int,unsigned int);

int main(int argc, char* argv[])
{
    Fptr p;
    MatrixInterface<int> *x;
    char path[]="basicmatrix.dll";
    HINSTANCE hDll = LoadLibrary(path);
    cout<<(char*)path<<endl;
    if(hDll)
    {
        cout<<"Library opened succesfully!"<<endl;
        p = (Fptr)GetProcAddress(hDll,"CreateMatrixInstance");
        if(p) {
            cout<<"working!\n";
            x=p(7,8);
            cout<<"MatrixCreated"<<endl;
            delete x;

        } else {
            cout<<"Failed loading function CreateMatrixInstance\n";
        }
    }
    else
    {
        cout<<"Failed loading library "<<(char*)path<<endl;
    }
    system("pause");
    FreeLibrary(hDll);
    return 0;
}

Базовый класс присутствует как в DLL, так и в исполняемом файле.


По какой-то причине Visual Studio не может открыть DLL (скомпилированную с помощью MSVC или MinGW). Я скомпилировал программу с помощью MinGW, и она загружает файл .dll.


Подскажите, пожалуйста, что не так с моим кодом?

3
Cristi 3 Янв 2013 в 15:50
Здесь есть чистый пример того, как явно создавать экземпляры шаблонов: cplusplus.com/articles/1C75fSEw
 – 
Stephane Rolland
3 Янв 2013 в 16:13

1 ответ

Лучший ответ

Шаблоны разрешаются только во время компиляции! И они будут разных типов в двух разных единицах компиляции. (Это причина того, почему действительно опасно экспортировать функции с параметрами std::string).

Как следствие, вы должны явно привязать шаблоны к типам, которые вы собираетесь использовать / разрешать использовать.

В вашем файле exportimport.h должны быть экземпляры шаблонов всех типов, которые вы собираетесь предоставить в своей dll. А именно MatrixInterface<int>.

Вы должны написать:

template class MatrixInterface<int>;

Так, чтобы выставить один-единственный тип. ср. Что означает `шаблон шаблона класса Пример ;` оператор означает с C ++ 11?

См. ссылку на документацию здесь: https://en.cppreference.com/w/cpp / language / class_template # Class_template_instantiation

10
Stephane Rolland 19 Ноя 2018 в 20:18
2
Это время компиляции! Я имею в виду создание шаблона .
 – 
Stephane Rolland
3 Янв 2013 в 16:15
1
class template ... - вы уверены, что поняли? Я не буду сейчас искать допустимый синтаксис C ++, но почему-то думаю, что должно быть наоборот - template class ....
 – 
amn
27 Окт 2018 в 23:17
1
Я все еще очень не уверен, что указывает class template ... совместимому компилятору C ++ 11 (я предполагаю, что синтаксис недействителен для более ранних версий C ++). Я использовал шаблоны раньше и знаю, что могу создать экземпляр шаблона с помощью template class Example<int>;. Я последовал вашей рекомендации и задал соответствующий вопрос на stackoverflow.com/questions/53030882/…, вы можете проследить его и попытаться уточнить.
 – 
amn
28 Окт 2018 в 17:00
1
Большое спасибо за специальный вопрос. В то время, когда я писал этот ответ, я думаю, что все еще часто использовал свой компилятор Microsoft Visual C ++ 10. Я склонен думать, что это правильный синтаксис для этого компилятора. Я слежу за вашим вопросом и обновлю свой ответ в соответствии с тем, каким должен быть стандарт синтаксиса. Спасибо.
 – 
Stephane Rolland
28 Окт 2018 в 17:10
1
Я ценю вашу приверженность этому делу, большое спасибо за помощь мне и всем, кто сталкивается с этой проблемой.
 – 
amn
28 Окт 2018 в 22:31