0

次のテンプレート クラスの問題点を教えてください。

#include <vector>

template <typename T, typename C>
struct pQueue{
    pQueue():currEnd(c.end()){};
    ~pQueue(){c.~vector();}
    void insert(T& t);
    void remove(T& t);
    bool find(T& t);
    T head(void);
private:
    std::vector<T> c;
    std::vector<T>::iterator currEnd;
};

コンパイラはこの行に満足しておらずstd::vector<T>::iterator currEnd;、次のエラー メッセージを生成します。

エラー C2146: 構文エラー: ';' がありません 識別子「currEnd」の前

エラー C4430: 型指定子がありません - int と見なされます。注: C++ は default-int をサポートしていません

どうもありがとうございました!

4

4 に答える 4

3

コンパイラは型として認識しませんstd::vector<T>::iterator。あなたはそれを言わなければなりません:

typename std::vector<T>::iterator currEnd;

typenameテンプレート化されたコンテキストで曖昧さ回避ツールとして使用されます。std::vector<T>::iterator識別子が静的メンバーではなく型であることをコンパイラに伝えるだけです。Tほとんどの場合、テンプレート パラメーターが指定される前であっても、コンパイラはそれを実行できますが、標準では、テンプレート化されたコンテキストでこれが必要です。


上記はあなたの質問に答えていますが、あなたのコードについて juanchopanza が指摘したことだけを強調できます。その上、std::queueすでにあなたのためにあります。

于 2013-08-27T13:02:57.640 に答える
1

依存する名前であるため、イテレータが型名であることをコンパイラに伝える必要があります。

typename std::vector<T>::iterator currEnd;

それに加えて、このクラスはユーザー提供のデストラクタを必要としません。クラス定義は次のように簡略化できます。

template <typename T>
struct pQueue
{
    pQueue() : currEnd(c.end()) {};
    void insert(const T& t);
    void remove(const T& t);
    bool find(const T& t);   // this should probably be a const method
    T head();                // this should probably be a const method
private:
    std::vector<T> c;
    typename std::vector<T>::iterator currEnd;
};
于 2013-08-27T13:03:05.233 に答える
0

あるべきだと思います typename std::vector<T>::iterator currEnd;

次に、コンパイラ コンパイラコンパイラは、それiteratorが実際には型であり、(のstd::vector)メンバーではないことを理解できます。

于 2013-08-27T13:03:21.577 に答える
0

他の回答への補遺として:

残念ながら、VisualStudio には適切なエラー メッセージがありません。文字どおりに読むのではなく、意味を学ぶ必要があります。例えば:

missing ';' before identifier 'currEnd'

Is VisualStudio-ese は通常、「以前の識別子がわからない」という意味currEndです。通常、これはその時点で定義されていないことが原因です。#include10回のうち9回は、ヘッダーに無視したタイプ/クラスのタイプ/クラス名になります。この場合、コンパイラがテンプレートでのテンプレートの使用と混同することが問題だったようです。

しかし、原則は立っています。「コンパイラは、以前の型/クラスが何であるかを認識していませんcurrEnd。」から始めていたら、正しい軌道に乗っていたでしょう。

于 2013-08-27T13:29:12.083 に答える