C2491:'std :: numpunct< _Elem> :: id':不允许定义dllimport静态数据成员

时间:2011-12-06 14:19:39

标签: visual-c++ compiler-errors

给出以下代码,

#include <sstream>
#include <stdint.h>

template <typename D> void func() {
    std::basic_stringstream<D> outStream;
    D suffix = 0;
    outStream << suffix;
}

void main() {
    func<char>();     // OK
    func<wchar_t>();  // OK
    func<uint16_t>(); // generates C2491
}

以下编译错误是什么意思?

  

错误C2491:'std :: numpunct&lt; _Elem&gt; :: id':不允许定义dllimport静态数据成员

1 个答案:

答案 0 :(得分:3)

您无法使用

声明方法
_declspec(dllimport)

并为他们提供定义。

限定符告诉编译器该函数是从与您现在编译的库不同的库中导入的,因此为它提供定义是没有意义的。

包含标题时,限定符应为

_declspec(dllimport)

当您编译提供方法定义的模块时,它应该是:

_declspec(dllexport)

通常的做法是:

#ifdef CURRENT_MODULE
#define DLLIMPORTEXPORT _declspec(dllexport)
#else
#define DLLIMPORTEXPORT _declspec(dllimport)
#endif

define CURRENT_MODULE仅在包含定义的模块中定义,因此在编译该模块时,会导出该方法。包含标题的所有其他模块都没有定义CURRENT_MODULE,并且将导入该函数。

我猜你的指示 - _declspecimport - 与此类似。