C++ 更改typedef的含义

C++ 更改typedef的含义,c++,typedef,C++,Typedef,我的代码中有以下声明: typedef QString String; 然后在另一个标题中,我会: class MyClass { typedef String String; }; 出现以下错误: error: changes meaning of 'String' from 'typedef class QString String' [-fpermissive] 使用此重新声明有什么问题?由于类型别名的工作方式,编译器认为您试图在

我的代码中有以下声明:

typedef QString                          String;
然后在另一个标题中,我会:

class MyClass {
  typedef String String;
};
出现以下错误:

error: changes meaning of 'String' from 'typedef class QString String' [-fpermissive]

使用此重新声明有什么问题?

由于类型别名的工作方式,编译器认为您试图在其内部定义
MyClass::String
。一切都变得混乱起来

[C++11:7.1.3/6]:
在给定范围内,不得使用
typedef
说明符重新定义该范围内声明的任何类型的名称以引用其他类型。[……]

下面是一个完整的示例:

typedef int alias_t;

class T
{
  typedef alias_t alias_t;
};
:

test.cpp:4:错误:“typedef alias\u t::alias\u t”的声明
test.cpp:1:错误:将“alias_t”的含义从“typedef int alias_t”更改为


我可以通过向现有类型添加
前缀:

typedef int alias_t;

class T
{
  typedef ::alias_t alias_t;
};

在您的代码中,这将转换为以下内容:

class MyClass
{
   typedef ::String String;
};

我记得相关的std规则确保名称在类范围内只有一个含义;如果
MyClass
位于某个
名称空间myNameSpace
?@bitmask定义“那个”。@LightnessRacesinOrbit:“那个”:=
typedef::String
@bitmask我不明白为什么。前导
::
相当于Linux
/
,而不是Linux
。/
。但是试试看!