用于展平容器容器的通用功能

jap*_*iss 7 c++ generics containers templates

我试图更好地掌握迭代器和泛型函数.我认为编写一个转换container1 < container2 <type> >为的函数是一个有用的练习container3 <type>.例如,它应该能够转换vector< deque<int> >list<int>.

我认为所有容器访问都应该通过迭代器,就像函数一样<algorithm>.

这是我的代码:

#include <iterator>
#include <algorithm>

// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest)
{
    using namespace std;

    while (start != end) {
        dest = copy(start->begin(), start()->end(), dest);
        ++start;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在以下代码中调用它时:

int main ()
{
    using namespace std;

    vector< vector<string> > splitlines;
    vector<string> flat;

    /* some code to fill SPLITLINES with vectors of strings */

    flatten(splitlines.begin(), splitlines.end(), back_inserter(flat));
}
Run Code Online (Sandbox Code Playgroud)

我收到一个巨大的C++模板错误消息, undefined reference to void flatten< ... pages of templates ...

我觉得我的代码太容易编写了,我还需要更多的东西来确保内部容器中的数据类型与输出容器中的数据类型相匹配.但我不知道该怎么办.

orl*_*rlp 8

我发现了这个问题.由于SFINAE(替换故障是不是一个错误),你的编译器,因为你正试图打电话找不到正确的模板operator()start通过输入start()(可能是一个错字).试试这个:

#include <iterator>
#include <algorithm>

// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest) {
    while (start != end) {
        dest = std::copy(start->begin(), start->end(), dest);
        ++start;
    }
}
Run Code Online (Sandbox Code Playgroud)