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

时间:2015-08-14 05:07:26

标签: c++ visual-c++ visual-studio-2015

我正在尝试进行一些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

我在一些在线编译器上试过这个,但那里没有错误。

感谢您的帮助!

1 个答案:

答案 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>

无论哪种方式,我认为代码示例应该编译,这是微软需要解决的问题。