1

我的代码中有以下声明:

typedef QString                          String;

然后在另一个标题中我做:

class MyClass {
  typedef String String;
};

并发生以下错误:

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

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

4

1 回答 1

2

由于类型别名的工作方式,它看起来像您试图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_t T::alias_t'的
声明 test.cpp:1:错误:从'typedef int alias_t'更改'alias_t'的含义


我可以通过将前缀添加到现有类型来修复此示例:::

typedef int alias_t;

class T
{
  typedef ::alias_t alias_t;
};

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

class MyClass
{
   typedef ::String String;
};
于 2013-03-03T21:45:40.990 回答