我试图在函数中声明一个新的向量,其值类型来自迭代器,如下所示。如果此函数不是递归的,则它正在编译,但是当函数调用它时,self不会编译。
template<typename ForwardIterator>
auto Foo(ForwardIterator f, ForwardIterator l) {
typedef typename iterator_traits<ForwardIterator>::value_type T;
auto n = distance(f,l);
vector<T> v(n);
auto h = n /2;
auto m = next(f,h);
auto vr = Foo(f,m); // If this line is commented it is compiling
return v;
}
int main() {
vector<int> v = { 38, 27, 43, 3, 9, 82, 10 };
auto rv = Foo(v.begin(), v.end());
return 0;
}
答案 0 :(得分:0)
您的编译器似乎无法推断出auto
类型。您可以通过实现iterator_type2vector_type
帮助程序类来帮助它推断返回类型。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
template<typename ForwardIterator>
struct iterator_type2vector_type {
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
typedef std::vector<value_type> vector_type;
};
template<typename ForwardIterator>
typename iterator_type2vector_type<ForwardIterator>::vector_type
Foo(ForwardIterator begin, ForwardIterator end) {
typedef typename iterator_type2vector_type<ForwardIterator>::vector_type vector_type;
// add your code here.
return vector_type(begin, end);
}
int main() {
auto a = {1, 2 ,3, 4};
auto result = Foo(std::begin(a), std::end(a));
std::copy(std::begin(result), std::end(result), std::ostream_iterator<int>(std::cout, ", "));
return 0;
}
auto
返回类型是 c ++ 14 功能,因此通过此更改,您可以使用 c ++ 11 。