2

我正在尝试创建一个导出创建方法的模板化工厂类:

template <typename T>
class ClassFactory
{
    _declspec(dllexport) static void* Create()
    {
        return new T;
    }
};

class Foobar : ClassFactory<Foobar>
{
    std::string foo;
};

这段代码编译得很好,但是当我查看dumpbin /exports的输出时,我在导出表中看不到任何内容

以下代码正确导出 Create():

class ClassFactoryBase
{
    _declspec(dllexport) virtual void* Create() = 0;
};

template <typename T>
class ClassFactory : ClassFactoryBase
{
    void* Create()
    {
        return new T;
    }
};

class Foobar : ClassFactory<Foobar>
{
    std::string foo;
};

但是,我需要 Create() 是静态的。为什么样品 2 有效,而样品 1 无效?有没有办法导出静态模板方法?

4

2 回答 2

2

编译器看到该Create()函数从未被调用,因此它不会为它生成任何代码。要使其工作,您需要像这样显式实例化您的模板:

template class ClassFactory<Foobar>;

只需将此行添加到您的源。现在编译器将为这个函数生成代码并将其导出。有关详细信息,请参阅此 MSDN 文章 -显式实例化 (C++)

要回答您的另一个问题,为什么示例 2 有效而示例 1 无效,让我们仔细看看派生类 Foobar。这个类中有一个虚函数,所以编译器必须生成一个 vtable。要填写 vtable,编译器需要知道 Create() 的地址,这是它从基类模板隐式实例化的时候。该函数的代码根据要求生成并导出到 DLL。这就是示例 2 有效的原因。

于 2012-05-23T10:36:22.637 回答
0

无法从 DLL 中导出模板方法,因为甚至没有编译非实例化模板方法。您的示例对 DLL 本身没有多大作用,头文件是使一切正常工作的头文件。

于 2012-04-11T09:01:07.970 回答