2
typedef int abc;

class Some{
   public:
      abc foo(){...}
      typedef double abc;
};

上記のコードでは、エラーが発生することがわかりました。

error: changes meaning of 'abc' from 'typedef int abc'

本のc++ 入門書、第 5版では、次のように書かれているためです。

クラス定義は、次の 2 つのフェーズで処理されます。

1.最初に、メンバー宣言がコンパイルされます。

2.関数本体は、クラス全体が表示された後にのみコンパイルされます。

しかし、ここのコードでは:

typedef int abc;

class Some{
     public:
        int foo(abc){...}
        typedef double abc;
};

abcパラメータリストに設定しました。しかし、そのようなエラーは発生せず、コンパイラは完全に正常に動作します。後者のコードで前者と同様のエラーが発生しないのはなぜですか?

4

4 に答える 4

1

理由はないと思います。このエラーは (標準 C++ に従って) 診断を必要としないため、コードにこのエラーがある場合、動作は事実上未定義です。

コンパイラは、このエラーのパラメーター リストをチェックしていませんが、チェックしている可能性があります。

于 2013-05-09T23:26:43.997 に答える
0

あなたはそれを修飾する必要がありますSome::abc:

typedef int abc;

class Some{
   public:
      Some::abc foo(){...}
      typedef double abc;
};
于 2013-03-20T13:52:14.367 に答える
0

最初の例でエラーが発生する理由は、名前の検索で戻り値の型が考慮されていないためです。しかし、実際の関数本体が呼び出されている式で生成されている場合、コンパイラはSome::abc不一致を使用して検出します。

typedef int abc;

class Some{
   public:
      abc foo() { return abc(); }  // during lookup/resolution, "abc" is known to be int, return type is not considered
      typedef double abc;
};

int main() 
{ 
    Some s; 
    int x = s.foo(); // kaboom, return type is double.
}

abc2番目の例では、内部のtypedefの定義がまだ表示されていないため、名前の検索中にintであることがわかっているため、型の再定義は重要ではありません。戻り値の型も int であるため、呼び出しサイトでの関数のインスタンス化中に影響はありません。単純にミスマッチはありません。

typedef int abc;

class Some{
   public:
      int foo(abc) { return int(); }  // during lookup/resolution, "abc" is known to be int
      typedef double abc;             // this will not have been seen yet in the previous line
};

int main() 
{ 
    Some s; 
    int x = 0;
    s.foo(x); // OK, x is of type int
}
于 2013-05-09T22:38:20.910 に答える