我正在尝试进行一些基础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++编译器中的错误,或者甚至是两者中的错误。
,第85行,在class numpunct
中声明:
__PURE_APPDOMAIN_GLOBAL _CRTIMP2_PURE static locale::id id; // unique facet id
,第258/259行定义:
template<class _Elem>
__PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
_CRTIMP2_PURE
定义为_CRTIMP2
,而__declspec(dllimport)
依次定义为__declspec(dllimport)
。现在,根据我对VC++文档的阅读,应该可以。静态声明中允许使用
__declspec(dllimport)
。但是,在静态定义上是不允许的。但是定义没有__declspec(dllimport)
,只有声明有。尽管如此,仍会产生错误:编译器正在查看该定义,将其视为
__declspec(dllimport)
对待,并产生一个错误。我不确定是编译器错误还是库错误,原因是编译器还会发出警告,说明声明和定义不匹配-一个是
__declspec(dllimport)
,另一个是__declspec(dllimport)
。由于根据文档的定义不能为num_get::id
,因此对我而言,声明或定义均不应为_CRTIMP2_PURE
。如果我们看看其他类似的成员,这种怀疑得到了证实。例如,
num_put::id
不是_CRTIMP2_PURE
,也不是__declspec(dllimport)
。因此,我认为有两种可能性。一种是ojit_code错误,应将其删除。另一个是当编译器声称定义为ojit_code时(如果不是),则发出错误的诊断。
无论哪种方式,我都认为代码示例应该可以编译,这是Microsoft需要修复的问题。
关于c++ - 在VC++ 14中使用std::basic_stringstream <char16_t>时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32002653/