我正在尝试做一些baic 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();
}
创建错误:
Error C2491 'std::numpunct<_Elem>::id': definition of dllimport static data member not allowed. xlocnum 259
我在一些在线编译器上试过这个,但那里没有错误.
感谢您的帮助!
最佳答案 好吧,它看起来像VC标准库或VC编译器中的错误,或者甚至两者都有.
< xlocnum>,第85行,在类numpunct中声明:
__PURE_APPDOMAIN_GLOBAL _CRTIMP2_PURE static locale::id id; // unique facet id
< xlocnum> ;,第258/259行定义:
template<class _Elem>
__PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
_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)时,编译器发出错误的诊断信息.
无论哪种方式,我认为代码示例应该编译,这是微软需要修复的东西.