【问题标题】:C2491: 'std::numpunct<_Elem>::id' : definition of dllimport static data member not allowedC2491:“std::numpunct<_Elem>::id”:不允许定义 dllimport 静态数据成员
【发布时间】:2011-12-06 14:19:39
【问题描述】:

给定以下代码,

#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<_elem>::id':不允许定义 dllimport 静态数据成员

【问题讨论】:

  • 对我来说听起来像是一个完全合理的问题(呈现一段短代码和一个编译错误)。我真的不知道为什么有些人急于关闭它:(
  • 同样的问题,这似乎是 MSVC 标准头 xlocnum 或周围代码中的错误。

标签: visual-c++ compiler-errors


【解决方案1】:

你不能用

声明方法
_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 - 与此类似。

【讨论】:

猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多