在VC 14中使用std :: basic_stringstream时出错

我正在尝试做一些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&gt ;,第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)时,编译器发出错误的诊断信息.

无论哪种方式,我认为代码示例应该编译,这是微软需要修复的东西.

点赞