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:エラー:'alias_t'の意味を'typedefintalias_t'から変更


既存のタイプにプレフィックスを追加することで、この例を修正できます。::

typedef int alias_t;

class T
{
  typedef ::alias_t alias_t;
};

あなたのコードでは、それは次のように変換されます:

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