编译错误C ++模板函数,迭代器作为参数

时间:2012-09-24 20:16:12

标签: c++ templates

我以为我开始掌握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'的模板声明

tia.cc:7:37:错误:预期')'在'itr'之前

tia.cc:7:42:错误:在'const'之前预期的primary-expression

tia.cc:在函数'int main()'中:

tia.cc:25:39:错误:'print_vec'未在此范围内声明

提前感谢。

3 个答案:

答案 0 :(得分:6)

容器的类型不能从迭代器的类型中推断出来。您只需将模板转换为:

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

    return true;
}

答案 1 :(得分:3)

第一个问题:您尚未使用typename。如果类型取决于模板参数,则必须在类型前加typename

其次,编译器无法推断type。它只能看到ivec.begin()的类型,并且不知道可能将其作为typedef的任何其他类型。您只能直接使用const_iterator - 无论如何都不能T::const_iterator - 明确地传递T

答案 2 :(得分:2)

最好的解决方案是根据迭代器类型来模板,因为无法从函数参数中推断出容器的类型:

template <typename Iterator>
bool print_vec(Iterator itr, Iterator end) { .... }