2011-08-24 113 views
2

我的下面的代码编译,但我不知道如何写,而不使用decltype。我在使用decltype的行下面的注释行中写入了失败的尝试。什么是back_inserter(容器)的类型

#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," ")); 
} 

由于

苏雷什

回答

2

的类型将是back_insert_iterater<vector<int> >。您的第三个示例不起作用,因为您需要在“>>”之间留出空格。请参阅http://www.cplusplus.com/reference/std/iterator/back_insert_iterator/,它仅包含一个指向容器类型的指针,并将operator =重新定义为container.push_back。我相信这是存在的,以便std容器可以使用std算法。但是,由于您已将控件的定义控制为Fill,因此您可以只允许Fill类容纳容器指针并直接对容器调用push_back。

+0

即使按照您的建议将右尖括号关闭,我会收到编译错误:'error:template argument 1 is invalid'。我用'-std = C++ 0x'选项使用g ++ 4.4。这就是为什么我将正确的斜角支架放在一起的原因。我的要求是编写一个函数,它只接受输出迭代器并填充它,就像在STL'copy'算法中看到的那样。那么我哪里错了? – suresh

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")); 
+0

在我原来的文章中,一个直角支架丢失,因此编译器给出了错误消息。愚蠢的错误....正确的代码在下面给出,现在代码编译正确! 'Fill >> h;' – suresh

1

如果您使用的是C++ 0x中,答案是:“自动”:d

+0

我只是想知道实际的类型是什么。我用'decltype'管理,但想知道确切的类型! – suresh

+1

@fileoffset你尝试过吗?我不认为Fill f;不编译。 – Jagannath

0

我想通了,在我原来的职位的错误是,我错过了在尖括号中右三定义h。它应该纠正为

Fill<back_insert_iterator<vector<int>>> h; 

现在代码将按预期进行编译和工作。