我正在尝试进行一些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
我在一些在线编译器上试过这个,但那里没有错误。
感谢您的帮助!
答案 0 :(得分:3)
好吧,它看起来像是VC ++标准库或VC ++编译器中的一个错误,或者甚至两者都有。
&lt; xlocnum&gt;,第85行,在true
内声明:
class numpunct
&lt; xlocnum&gt;,第258/259行定义:
__PURE_APPDOMAIN_GLOBAL _CRTIMP2_PURE static locale::id id; // unique facet id
template<class _Elem>
__PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
定义为_CRTIMP2_PURE
,后者又定义为_CRTIMP2
。
现在,根据我对VC ++文档的阅读,那应该没问题。静态声明允许__declspec(dllimport)
。但是,静态定义不允许这样做。但是定义没有__declspec(dllimport)
,只有声明。
尽管如此,正在产生错误:编译器正在查看定义,将其视为,好像它是__declspec(dllimport)
,并产生错误。
我不确定是编译器错误还是库错误的原因是编译器还发出警告,抱怨声明和定义不匹配 - 那个是__declspec(dllimport)
并且其他不是。由于定义不能,根据文档,__declspec(dllimport)
,这表明既不声明也不定义应为__declspec(dllimport)
。< / p>
如果我们看一下其他类似的成员,这种猜疑就会被证实。例如,__declspec(dllimport)
不是num_get::id
,也不是_CRTIMP2_PURE
。
所以我认为有两种可能性。一个是num_put::id
出错了,应该将其删除。另一个是当编译器声称定义为_CRTIMP2_PURE
时,编译器发出错误的诊断信息,而不是。{/ p>
无论哪种方式,我认为代码示例应该编译,这是微软需要解决的问题。