0

次のような C++ テンプレートを使用できない理由を誰か説明してもらえますか。

template <typename T> class A {
public:
    typedef std::vector<T>::iterator myiterator;

    A(T value)
        :   v(10, value)
    {
    }

    myiterator begin()
    {
        return v.begin();
    }

    myiterator end()
    {
        return v.end();
    }

public:
    std::vector<T> v;
};

int main()
{
    A<int> a(10);

    for (auto i = a.begin(); i != a.end(); ++i)
        std::cout << *i << std::endl;

    return 0;
}

myiterator エイリアスが宣言されている行でコンパイル エラーが発生しました。エラーは次のとおりです。「「;」がありません」識別子「myiterator」の前」。

4

3 に答える 3

4

変化する

typedef std::vector<T>::iterator myiterator;

typedef typename std::vector<T>::iterator myiterator;

テンプレート化された型 (ベクトル) を介して型にアクセスしているため、コンパイラが曖昧さを解消するのを助ける必要があります。vector<T>::iterator静的メンバーまたは型のいずれかです。T についての知識がなければ、コンパイラは確信を持てません。そこでキーワードを使用するtypenameと、コンパイラに「これを型として扱う」ように指示されます。

詳細については、「template」キーワードと「typename」キーワードをどこに、なぜ入力する必要があるのですか? を参照してください。

于 2013-10-10T14:42:42.523 に答える
2

コンパイラはstd::vector型であり、従属スコープであることを認識している必要があります。

typedef typename std::vector<T>::iterator myiterator;
于 2013-10-10T14:43:15.210 に答える
1

役立つエラー メッセージが表示されます。

 'std::vector<T>::iterator' : dependent name is not a type
          prefix with 'typename' to indicate a type

タイプを宣言していることを伝える必要があります。

typedef typename std::vector<T>::iterator myiterator;
//      ^^^^^^^^
于 2013-10-10T14:45:05.640 に答える