3

次のコードは、反復子が宣言されている行で構文エラーを生成します。

template <typename T>
class A
{
  public:

    struct B
    {
       int x, y, z;
    };

    void a()
    {
        std::map<int, B>::const_iterator itr; // error: ; expected before itr
    }

    std::vector<T> v;
    std::map<int, B> m;
};

これは、A がテンプレート化されたクラスである場合にのみ発生します。このコードの何が問題になっていますか? A から B を移動すると、コードは正常にコンパイルされます。

4

1 に答える 1

8

タイプ名が必要です:

 typename std::map<int, B>::const_iterator itr;

イテレータは依存型 (B に依存) であり、この状況が発生した場合、コンパイラは型名でそれを明確にするように要求します。

この問題についての合理的な議論がここにあります。

于 2009-03-19T09:03:12.997 に答える