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_iterator- 没有T明确通过。

于 2012-09-24T20:19:13.410 回答
2

最好的解决方案是根据迭代器类型进行模板化,因为不能从函数参数中推断出容器的类型:

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