2016-09-20 7 views
0

私はクラス定義で "typedef"を使用していますが、このクラスが異なる位置で発生すると、異なる動作をし、エラーが発生する可能性があります。次のコードを確認してください。異なる部分に定義された "typedef"を含むクラスがエラーになるのはなぜですか?

コードのこのバージョンでは、エラーの原因となることがあります。

#include <vector> 
#include <string> 
class B; 
class A 
{ 
    public: 
     A() { } 
     std::vector<B::size_type> vec; 
}; 
class B 
{ 
    public: 
     typedef std::vector<std::string>::size_type size_type; // [Error] incomplete type 'B' used in nested name specifier 
}; 

しかし、次のコードは正常に動作します:

#include <vector> 
#include <string> 
class B 
{ 
    public: 
     typedef std::vector<std::string>::size_type size_type; 
}; 
class A 
{ 
    public: 
     A() { } 
     std::vector<B::size_type> vec; 
}; 
+0

コードが順番に解析されるため(上​​から下へ)最初のバージョンでは、Bは前方宣言されており、typedefは知られていません。 2番目のバージョンでは、typedefが使用される前にBが完了しています。 – Hayt

答えて

1

問題はtypedef自体にではなく、定義の順に。

最初のコードスニペットでは、コンパイラはB::size_typeが何であるかを知りません - それはclass Bが存在することだけを知っています。後者の場合、コンパイラはすでにtypedefを知っています。したがって、B::size_typeです。

これは、コンパイラがコードを行ごとに「読み取り」(解析)し、定義の順序が重要なために発生します。

+0

クラス定義のシーケンスを調整する以外に、このようなエラーを回避するには、他に何ができますか?友達クラスを使用していますか? –

+0

@Vogel_guo - いいえ、何もできません。クラスを別のヘッダに分割することもできますが、 'include'も同じように重要です。シンボルを定義する順序は重要です。また、これらのエラーはコンパイル時ですので、実行時には危険ではありません。 –

+1

これはあなたの説明の後で分かります。ありがとうございます。 –

関連する問題