【问题标题】:Template function with iterators带有迭代器的模板函数
【发布时间】:2012-01-20 01:26:17
【问题描述】:

我一直在尝试做 Ex。 10-02 in 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;
}

是什么导致了这个错误?

【问题讨论】:

    标签: c++ templates compiler-errors iterator


    【解决方案1】:

    编译器无法在此处推断返回类型。实际上这里不需要将返回类型设置为模板参数:

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

    【讨论】:

    • +1,这个答案是处理此类容器的更简单和正确的方法。
    • 啊,很好.. 我的书还没有介绍 ::value_type 的使用,尽管我查看了索引,它在下一章.. 解决我的问题的好方法,谢谢!
    【解决方案2】:

    问题是你的函数原型:

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

    使用templates时,返回类型是依赖类型(这里是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&lt;&gt; 并明确提及int,所以 该返回类型是可推导出的

    [注意:这个解决方案对于你的理解来说是非常通用的。正如@Bjorn 的回答中提到的,对于vector&lt;&gt;,可以使用::value_type 自动推断类型。]

    【讨论】:

    • 谢谢!我的书确实涵盖了在调用模板函数时使用显式提及,忘记了这一点。不像@Bjorn 那样干净,但可以使用我(应该)到目前为止的知识。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多