Rus*_*ene 5 c++ visual-c++ visual-studio-2015
我正在尝试进行一些基础char16_t字符串(u16string)处理,并且遇到了一些麻烦。这个简短的程序:
#include <string>
#include <sstream>
int main()
{
int foo = 65;
std::basic_stringstream<char16_t> ss;
ss << foo;
std::u16string s = ss.str();
}
Run Code Online (Sandbox Code Playgroud)
产生错误:
Error C2491 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed. xlocnum 259
Run Code Online (Sandbox Code Playgroud)
我已经在一些在线编译器上尝试过了,但是那里没有错误。
感谢您的任何帮助!
好吧,它看起来像是 VC++ 标准库或 VC++ 编译器中的错误,甚至可能两者都是。
<xlocnum>,第 85 行,在 内声明class numpunct:
__PURE_APPDOMAIN_GLOBAL _CRTIMP2_PURE static locale::id id; // unique facet id
Run Code Online (Sandbox Code Playgroud)
<xlocnum>,第 258/259 行定义:
template<class _Elem>
__PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
Run Code Online (Sandbox Code Playgroud)
_CRTIMP2_PURE被定义为_CRTIMP2, 又被定义为__declspec(dllimport)。
现在,根据我对VC++文档的阅读,应该没问题。__declspec(dllimport)允许在静态声明中使用。然而,静态定义不允许这样做。但定义没有__declspec(dllimport),只有声明有。
尽管如此,还是会产生错误:编译器正在查看定义,将其视为,并__declspec(dllimport)产生错误。
我不确定这是编译器错误还是库错误的原因是编译器还会发出警告,抱怨声明和定义不匹配——一个是,__declspec(dllimport)另一个不匹配。由于根据文档,定义不能是__declspec(dllimport),这表明声明和定义__declspec(dllimport)应该是。
如果我们看看其他类似的成员,这个怀疑就得到了证实。例如,num_get::id不是_CRTIMP2_PURE,也不是num_put::id。
所以我认为有两种可能。其一是_CRTIMP2_PURE是错误的,应该将其删除。__declspec(dllimport)另一个问题是,当编译器声明该定义是,而实际上不是时,它会发出错误的诊断。
不管怎样,我认为代码示例应该可以编译,这是微软需要解决的问题。