Visual c++ C2491:';标准::numpunct<_元素>;::id';:不允许定义dllimport静态数据成员

Visual c++ C2491:';标准::numpunct<_元素>;::id';:不允许定义dllimport静态数据成员,visual-c++,compiler-errors,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

给定以下代码

#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
}
#包括
#包括
模板void func(){
std::基本流外流;
D后缀=0;

扩展您不能用

_declspec(dllimport)
并为它们提供一个定义

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

包含标头时,限定符应为

_declspec(dllimport)
在编译为方法提供定义的模块时,它应该是:

_declspec(dllexport)
通常的做法是:

#ifdef CURRENT_MODULE
#define DLLIMPORTEXPORT _declspec(dllexport)
#else
#define DLLIMPORTEXPORT _declspec(dllimport)
#endif
定义
CURRENT\u模块
仅在包含定义的模块中定义,因此在编译该模块时,将导出该方法。包括标头的所有其他模块均未定义
CURRENT\u模块
,并且将导入该函数


我猜您的指令-
\u declspecimport
-与此类似。

对我来说听起来是一个非常合理的问题(给出了一段短代码和一个编译错误)。我真的不知道为什么有些人会匆忙关闭它:(这里也有同样的问题,这可能是MSVC std头xlocnum或周围代码中的错误。虽然这个答案是修复C2491的指南,但它不适用于当前情况(因为错误消息有误导性?),并且无法修复。我创建并添加了更多详细信息。