我的以下代码编译但我不知道如何在不使用decltype的情况下编写它。我在使用decltype的行下面的注释行中写了我失败的尝试。
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
template<class Out>
class Fill{
public:
Fill(){}
void fill(Out x){
for(int i = 0; i != 10; i++)*x++ = i;
}
};
int main(){
vector<int> v;
Fill<decltype(back_inserter(v))> f; //works
//does not work
//Fill<vector<int>::iterator> g;
//does not work
//Fill<back_insert_iterator<vector<int>> h;
f.fill(back_inserter(v));
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
}
由于
苏雷什
答案 0 :(得分:2)
类型为back_insert_iterater<vector<int> >
。您的第3个示例不起作用,因为您需要“&gt;&gt;”之间的空格。请参阅http://www.cplusplus.com/reference/std/iterator/back_insert_iterator/,它只是包含指向容器类型的指针,并重新定义operator =为container.push_back。我相信这是存在的,以便std容器可以使用std算法。但是,由于您已将控件定义控制为Fill,您可以简单地允许Fill类保存容器指针并直接针对容器调用push_back。
答案 1 :(得分:2)
vector<int> ints;
typedef back_insert_iterator<vector<int>> InserterType; // This is what you need.
Fill<InserterType> f;
f.fill(back_inserter(ints));
copy(ints.begin(), ints.end(), ostream_iterator<int>(std::cout, "\n"));
答案 2 :(得分:1)
如果您使用的是c ++ 0x,答案是:'auto':D
答案 3 :(得分:0)
我发现原帖中的错误是我错过了h
定义中的第3个直角括号。它应该更正为
Fill<back_insert_iterator<vector<int>>> h;
现在代码将按预期编译和工作。