C++ 没有名为'的类型;u16字符串';在命名空间中';std&x27;

C++ 没有名为'的类型;u16字符串';在命名空间中';std&x27;,c++,qt,C++,Qt,我正在使用Qt5.5.0 当我编译一个程序时,它显示“名称空间'std'中没有名为'u16string'的类型”。有趣的是,我过去成功地编译了它,为什么现在失败了?qstring.h似乎有问题 我怎么修理它?这里是错误发生的地方 #ifndef QSTRING_H #define QSTRING_H #if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII) #error QT_N

我正在使用Qt5.5.0

当我编译一个程序时,它显示“名称空间'std'中没有名为'u16string'的类型”。有趣的是,我过去成功地编译了它,为什么现在失败了?
qstring.h
似乎有问题

我怎么修理它?这里是错误发生的地方

#ifndef QSTRING_H 
#define QSTRING_H 
#if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII) 
#error QT_NO_CAST_FROM_ASCII and QT_RESTRICTED_CAST_FROM_ASCII must not be defined at the same time 
#endif 

#include <QtCore/qchar.h> 
#include <QtCore/qbytearray.h> 
#include <QtCore/qrefcount.h>
#include <QtCore/qnamespace.h> 
#include <string> 
#if defined(Q_OS_ANDROID)
// std::wstring is disabled on android's glibc, as bionic lacks certain features 
// that libstdc++ checks for (like mbcslen). namespace std { typedef basic_string<wchar_t> wstring; }
#endif

#if defined(Q_COMPILER_UNICODE_STRINGS) || defined(Q_QDOC) 
   static inline QString fromStdU16String(const std::u16string &s); 
   inline std::u16string toStdU16String() const; 
   static inline QString fromStdU32String(const std::u32string &s); 
   inline std::u32string toStdU32String() const; 
#endif 
\ifndef QSTRING\H
#定义QSTRING_H
#如果已定义(QT_NO_CAST_FROM_ASCII)和已定义(QT_RESTRICTED_CAST_FROM_ASCII)
#错误QT_NO_CAST_FROM_ASCII和QT_RESTRICTED_CAST_FROM_ASCII不能同时定义
#恩迪夫
#包括
#包括
#包括
#包括
#包括
#如果已定义(Q_OS_ANDROID)
//android的glibc上禁用了std::wstring,因为bionic缺少某些功能
//libstdc++检查(比如mbcslen)。命名空间std{typedef basic_string wstring;}
#恩迪夫
#如果已定义(Q_编译器_UNICODE_字符串)| |已定义(Q_QDOC)
来自stdu16string的静态内联QString(const std::u16string&s);
内联std::u16string toStdU16String()常量;
来自stdu32string的静态内联QString(const std::u32string&s);
内联std::u32string toStdU32String()常量;
#恩迪夫
有趣的是,我过去成功地编译了它,为什么现在失败了

早些时候,您可能会包含一些库的标题,而这些标题又包含
;在一些更新之后,可能会停止直接包含它,从而导致错误

如何修复它

在源代码中包含适当的头以避免此类问题

#include <string>
#包括

在发生错误的位置,确保使用名称空间引用它:
std::u16string

问题出在文件ExpGame.pro中。我删除代码如下:

QMAKE_cxflags+=-std=c++11

这没问题。

要修复它:

  • 由于mac上的Qt是由clang构建的,所以在“Qt创建者”->“首选项”->“工具包”中,您应该将“编译器”设置为clang

  • 不要编写“QMAKE_cxflags+=-std=c++11”,而是将以下配置添加到.pro文件中:

    CONFIG += c++11
    

  • 如果您发布您的代码,please@PaoloM#如果已定义(Q#编译器"UNICODE"字符串)|已定义(Q#QDOC)STDU16String的静态内联QString(const std::u16string&s);内联std::u16string toStdU16String()常量;来自stdu32string的静态内联QString(const std::u32string&s);内联std::u32string toStdU32String()常量#endif是否包含
    ?看到更多的代码会很有帮助。也许编辑你的问题而不是把代码作为注释发布。@ MUXMIT2X代码太长,大约有1500个低点。@圣福左,如 U16String 在C++头>代码>字符串中定义。确保在使用
    u16string
    的文件中包含
    #include
    这一行正常情况下是可行的,但在胜富的情况下没有帮助。失败发生在Qt库本身的一个名为qstring.h的头文件中。包含在他自己的所有头文件中不会改变任何东西。有趣的是,它包含在错误的头文件中(如复制到问题中的代码所示),但当引用std::u16string(也显示在代码中)时,问题仍然存在。我不确定真正的原因是什么,因为我自己也在努力解决同样的问题。这将删除对C++11的支持,因此您将无法使用任何C++11功能。我觉得这不是一个好的最终解决方案。