6

一般的な STL コンテナー (ベクター、リストなど) の表現を出力する関数を作成しようとしています。関数に、たとえばベクトルを表すテンプレート パラメーター T を指定しました。タイプ T のイテレータを取得するのに問題があります。

vector<int> v(10, 0);
repr< vector<int> >(v);

...

template <typename T>
void repr(const T & v)
{
    cout << "[";
    if (!v.empty())
    {
        cout << ' ';
        T::iterator i;
        for (i = v.begin(); 
             i != v.end()-1;
             ++i)
        {
            cout << *i << ", ";
        }
        cout << *(++i) << ' ';
    }
    cout << "]\n";
}

...

brett@brett-laptop:~/Desktop/stl$ g++ -Wall main.cpp
main.cpp: In function ‘void repr(const T&)’:
main.cpp:13: error: expected ‘;’ before ‘i’
main.cpp:14: error: ‘i’ was not declared in this scope
main.cpp: In function ‘void repr(const T&) [with T = std::vector<int, std::allocator<int> >]’:
main.cpp:33:   instantiated from here
main.cpp:13: error: dependent-name ‘T::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:13: note: say ‘typename T::iterator’ if a type is meant

コンパイラが提案したように「typename T::iterator」を試しましたが、より不可解なエラーしか発生しませんでした。

編集:助けてくれてありがとう!この機能を使用したい人のための作業バージョンは次のとおりです。

template <typename T>
void repr(const T & v)
{
    cout << "[";
    if (!v.empty())
    {
        cout << ' ';
        typename T::const_iterator i;
        for (i = v.begin(); 
             i != v.end();
             ++i)
        {
            if (i != v.begin())
            {
                cout << ", ";
            }
            cout << *i;
        }
        cout << ' ';
    }
    cout << "]\n";
}
4

3 に答える 3

18

型であるはずtypenameのコンパイラに指示する必要があります。::iteratorテンプレートをインスタンス化するまでTが何であるかがわからないため、コンパイラはそれが型であることを認識しません。たとえば、静的データメンバーを参照することもできます。それがあなたの最初のエラーです。

2番目のエラーは、 constvへの参照です。したがって、代わりにを使用する必要があります。非定数イテレータを定数コンテナに要求することはできません。::iterator::const_iterator

于 2010-09-17T11:51:46.977 に答える
4

はタイプであり、であるため、に変更T::iterator i;します。typename T::const_iterator i;::iteratorTvconst &

修飾された依存型の前に、が必要typenameです。がない場合、構文エラーが発生した場合でもtypename、修飾された依存名を解析する必要があるというC++解析ルールがあります。non-types

typename次の名前はタイプとして扱う必要があると述べています。それ以外の場合、名前は非型を参照すると解釈されます。

于 2010-09-17T11:53:04.723 に答える