在VC ++ 14中使用std :: basic_stringstream <char16_t>时出错

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)

我已经在一些在线编译器上尝试过了,但是那里没有错误。

感谢您的任何帮助!

DrP*_*zza 4

好吧,它看起来像是 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)另一个问题是,当编译器声明该定义是,而实际上不是时,它会发出错误的诊断。

不管怎样,我认为代码示例应该可以编译,这是微软需要解决的问题。