DLL仅导出某些模板化函数

0 c++

嘿所有,所以这对我来说似乎是一个相当奇怪的问题.我有一个非常简单的模板化容器类,它是DLL的一部分.整个类在头文件中定义,以允许自动生成模板.现在DLL的另一部分实际上请求生成某个模板类型,因此代码应该存在于DLL中.但是,当使用来自另一个可执行文件的对象时,构造函数/析构函数以及多个其他函数都可以工作,但链接器找不到2个函数.以下是这两个函数的代码,以及一个工作函数.

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

int getNumRows() const
{
    return m_nRows;
}

int getNumCols() const
{
    return m_nCols;
}
Run Code Online (Sandbox Code Playgroud)

因此链接器找不到getNumRows()和getNumCols()函数,但getData()函数是.这是一个常见问题,函数是否需要有一个模板化参数才能生成?

@ 1 800信息

我已经通过标准宏从DLL导出了这个:

#ifdef ACORE_EXPORTS
#define ACORE_API __declspec(dllexport)
#else
#define ACORE_API __declspec(dllimport)
#endif
Run Code Online (Sandbox Code Playgroud)

并在课堂定义:

template < class T >
class ACORE_API matrix
Run Code Online (Sandbox Code Playgroud)

小智 7

编译器只生成实际调用的成员函数.

例如:

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

然后是

MyClass<int> m;
m.function1();
Run Code Online (Sandbox Code Playgroud)

编译,因为从未编译过MyClass :: function2().

您可以通过执行以下操作强制实例化整个类:

template class MyClass<int>;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将实例化类中的每个方法.在此示例中,您将收到编译器错误.