带迭代器的模板函数

时间:2011-12-14 08:50:44

标签: c++ templates compiler-errors iterator

我一直在努力做Ex。 10-02在Accelerated C ++中,它给了我错误,我最终一直“简化”我的程序,直到我达到这一点,甚至它仍然无法编译(通过g ++)给我错误:

test.cpp: In function ‘int main()’:
test.cpp:22: error: no matching function for call to ‘dumb(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >)’

这是我的计划:

#include <algorithm>
#include <iostream>
#include <vector>

using std::cout;    using std::endl;
using std::vector;

template <class Ran, class T> T dumb(Ran begin, Ran end)
{
    return *begin;
}

int main()
{
    vector<int> myVector;
    for (int i = 1; i <= 9; ++i)
        myVector.push_back(i);

    int d = dumb(myVector.begin(), myVector.end());
    cout << "Value = " << d << endl;
    return 0;
}

导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:5)

编译器无法在此处推断返回类型。实际上没有必要在这里使return-type成为模板参数:

template <class Ran> typename Ran::value_type dumb(Ran begin, Ran end)
{
    return *begin;
}

答案 1 :(得分:1)

问题是你的功能原型:

template <class Ran, class T> T dumb(Ran begin, Ran end)

使用template时,返回类型是依赖类型(此处为T),无法隐式推断

所以你重新设计的功能应该是这样的:

template <class T, class Ran>
          // ^^^^^ 'T' is coming before 'Ran'
T dumb(Ran begin, Ran end)
{
  return *begin;
}

它应该被称为,

int d = dumb<int>(myVector.begin(), myVector.end());
             ^^^^

所以我们做了两处改动:

  1. 必须明确提及的类型(即T=int)是 来到第一个
  2. 明确提及dumb<>,致电int,以便     返回类型是可推断的
  3. [注意:此解决方案非常通用,供您理解。正如@ Bjorn的回答中所提到的,对于vector<>,可以使用::value_type自动推断出类型。]