我一直在努力做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;
}
导致此错误的原因是什么?
答案 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());
^^^^
所以我们做了两处改动:
T=int
)是
来到第一个dumb<>
,致电int
,以便
返回类型是可推断的 [注意:此解决方案非常通用,供您理解。正如@ Bjorn的回答中所提到的,对于vector<>
,可以使用::value_type
自动推断出类型。]