【问题标题】:Exporting/Defining Static Template Specialized Member Variable C++导出/定义静态模板专用成员变量 C++
【发布时间】:2014-10-10 03:08:25
【问题描述】:

所以我目前正在导出一个 DLL,我遇到了一个问题,我有一个包含静态 char*[] 成员变量的模板类。我想为该模板的专业化定义它。

示例:

我的模板.h

#include <dll_defines.h>

template <typename T>
class MY_API MyTemplate
{
    public:
        static char const*  m_array[];
}

MySpecializedTemplate.h

#include <dll_defines.h>
#include <MyTemplate.h>

class MY_API Specialized; //pretend its more than just a decl.

template <> char const* MyTemplate<Specialized>::m_array[] =
{
    "Hello, World", 
    "I need help"
};

我遇到的问题是当我尝试在另一个项目中链接 DLL 时,它给了我一个错误说明:

不允许定义 dllimport 静态数据成员

有没有办法定义模板的静态数据成员并导出它 到DLL中??

【问题讨论】:

  • 你使用什么编译器?又为什么要在头文件中定义你的静态数据成员?
  • 我使用的是 Visual Studio,所以是 MSVC。此外,根据我的理解,模板必须在头文件中定义。我假设模板类中包含的静态数据成员也需要。通常,类的静态数据成员在定义中初始化,.cpp 文件,但我不知道该怎么做,因为它是一个模板。
  • 显式特化实际上不是模板。所以它们应该只在头文件中声明。

标签: c++ templates


【解决方案1】:

好的,所以我意识到我实际上可以在实现文件中初始化静态模板变量。我还意识到我不应该将导出或导入宏附加到头文件中定义的模板函数。

DONT DO THIS:
template <typename T>
MY_API void foo()
{
    cout << "This won't link, don't try it << endl
}

意识到一旦将 MY_API 定义为,上面的问题就很严重了

__declspec(dllimport)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多