模板容器迭代器

时间:2015-05-03 19:40:09

标签: c++ templates iterator

我正在处理作业问题而且我无法编译这个问题:

我需要编写接受两个迭代器的函数(对于任何容器)并将min和max值作为一对返回

以下是我遇到的错误:

Error   1   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'  
Error   2   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'
Error   3   error C2783: 'std::pair<T,T> problem1(It,It)' : could not deduce template argument for 'T'

这是我的代码:

template <typename It, typename T>
std::pair<T,T> problem1(It start, It end)
{
    // initial min max
    T min = *start;
    T max = *start;


    It curr = start;
    while (curr != end)
    {
        // check if we have a new min or max
        if (min > *curr)
            min = *curr;
        if (max < *curr)
            max = *curr;

        curr++; // get next
    }

    return std::make_pair(min, max);
}

使用以下代码测试代码,我无法修改。

std::vector<int> a = { 1, 3, 12, -8, 22, 5, 41, 33 };
std::list<double> b = { 0.8, -123, 44, 56, 12, 231 };
std::array<unsigned int, 1> c;
c[0] = 12;
auto a_ans = problem1(a.begin(), a.end());
auto b_ans = problem1(b.begin(), b.end());
auto c_ans = problem1(c.begin(), c.end());
if (*a_ans.first == -8 && *a_ans.second == 41 &&
    *b_ans.first == -123 && *b_ans.second == 231 &&
    *c_ans.first == 12 && *c_ans.second == 12) {
    std::cout << "Test 1 passed.\n";
    score += 10;
}
else {
    std::cout << "Test 1 failed.\n";
}

2 个答案:

答案 0 :(得分:2)

编译器告诉你的是它无法从你提供给函数的参数中找出T。函数上的模板参数必须显式提供(a_ans = problem1<vector<int>::iterator, int>(a.begin(), b.begin())),或者必须从函数参数中扣除(编译器根据It和{{1}猜测start参数)。

幸运的是,迭代器有一个end成员:

value_type

基本上,您将template <typename It> std::pair<typename It::value_type, typename It::value_type> problem1(It start, It end) { // initial min max typename It::value_type min = *start; typename It::value_type max = *start; It curr = start; while (curr != end) { // check if we have a new min or max if (min > *curr) min = *curr; if (max < *curr) max = *curr; curr++; // get next } return std::make_pair(min, max); } 替换为T。这是因为iterator types know their value types,这也适用于C ++之前的11(如果您的老师对新语言版本感到害羞)。

答案 1 :(得分:0)

编译器无法知道T是什么类型。 您可以将其从模板中删除,然后使用decltype(*start)

使用decltype的优点是它可以使用原始指针和非标准迭代器(与:: value_type不同)