0

C++ のこつをつかみ始めたと思った....

それから、非常に単純なテンプレート関数だと思っていたものを書きましたが、突然何も意味がないように思えました。コンパイラは、私がテンプレート化された関数を定義したという事実さえ気に入らないようです。これは少しおかしいようです。これはコンパイルの単一ユニットであるため、何について不平を言っているのかわかりません。

#include <vector>
#include <iostream>

typedef std::vector<int> int_vec_type;

template <typename Type>
bool print_vec(Type::const_iterator itr, const Type::const_iterator end)
{
    for (; itr != end; ++itr) {
        std::cout << *itr << std::endl;
    }

    return true;
}

int
main()
{
    int_vec_type ivec;

    ivec.push_back(0);
    ivec.push_back(1);
    ivec.push_back(2);

    print_vec(ivec.begin(), ivec.end());

    return 0;
}

これらはコンパイルエラーです:

tia.cc:7:22: エラー: 'bool print_vec' のテンプレート宣言</p>

tia.cc:7:37: エラー: 'itr' の前に ')' が必要です</p>

tia.cc:7:42: エラー: 'const' の前にプライマリ式が必要です</p>

tia.cc: 関数 'int main()' 内:

tia.cc:25:39: エラー: 'print_vec' はこのスコープで宣言されていません

前もって感謝します。

4

3 に答える 3

6

コンテナーの型は、反復子の型から推測できません。テンプレートを次のように単純に変換できます。

template <typename Iterator>
bool print_vec(Iterator itr, const Iterator end)
{
    for (; itr != end; ++itr) {
        std::cout << *itr << std::endl;
    }

    return true;
}
于 2012-09-24T20:18:08.033 に答える
3

最初の問題: を使用していませんtypename。型がテンプレート引数に依存する場合は常に、型の前に を付ける必要がありますtypename

次に、コンパイラは を推論できませんtype。の型しか見ることができず、ivec.begin()それを typedef として持つ可能性のある他の型についてはわかりません。とにかく、明示的に渡すことなく、const_iterator直接のみを取ることができます。-を取ることはできません。T::const_iteratorT

于 2012-09-24T20:19:13.410 に答える
2

コンテナーの型は関数の引数から推測できないため、反復子の型に関してテンプレート化するのが最善の解決策です。

template <typename Iterator>
bool print_vec(Iterator itr, Iterator end) { .... }
于 2012-09-24T20:18:57.583 に答える