C++ 为容器编写分配过程

标签 c++ function stl iterator

我有一个容器,一个类,我想像 STL 那样为它提供一个方法赋值。

class myclass {
public:
   //...
   template < typename InputIterator >
   void assign(InputIterator first, InputIterator last);
   // ...
private:
   // ...
   std::vector<int> mystlcont;
   // ...
};

template < typename InputIterator >
myclass::assign(InputIterator first, InputIterator last) {
   this->mystlcont.clear();
   this->mystlcont.assign(first, last);
}

好的。好吧我编译,ok。 我现在用它...

myclass m;
std::vector<int> vect;
vect.push_back(1);
vect.push_back(1);
vect.push_back(2);
vect.push_back(3);
vect.push_back(5);
vect.push_back(8);
vect.push_back(13);
m.assign(vect.begin(), vect.end()); // Line X

在第 X 行调用函数时,编译器返回一个非常非常丑陋的错误。

workflow_test.hpp: In function ‘void middleware::WorkflowSerializationTest()’: workflow_test.hpp:114: error: invalid cast from type ‘__gnu_cxx::__normal_iterator

’ to type ‘middleware::TaskDescriptor*’ workflow_test.hpp:114: error: invalid cast from type ‘__gnu_cxx::__normal_iterator ’ to type ‘middleware::TaskDescriptor*’

workflow_test 是我调用函数 assign 的文件,myclass 代表 workflow.hpp 和 workflow.cpp 中的 Workflow 类... TaskDescriptor 是 vector 中的元素(myclass 中集合中的类型)。

你知道为什么会这样吗?

我怀疑在我的类中必须有一些运算符重载才能让这个机制正常工作....因为它不是方法实现的问题,即使我写

template < typename InputIterator >
void myclass::assign(InputIterator first, InputIterator last) {
   // NOTHING WRITTEN IN THE BODY
}

当被调用时引发完全相同的“异常”。

最佳答案

您拥有的不是您自己的容器,而是容器包装器。

但我只看到您的代码有一个问题:您的 myclass::assign 定义没有指定返回类型。

这段代码实际上对我有用:

#include <vector>
#include <algorithm>
#include <iostream>

class MyWrapper {
    public:
        template <typename InputIterator>
        void assign(InputIterator first, InputIterator last);

        const std::vector<int>& container() const { return container_m; }

    private:
        std::vector<int> container_m;
};

template <typename InputIterator>
void MyWrapper::assign(InputIterator first, InputIterator last)
{
    container_m.assign(first, last);
}

template <typename T>
void print(const T& x)
{
    std::cout << x << " ";
}

int main()
{
    MyWrapper mw;

    std::vector<int> vect;
    vect.push_back(1);
    vect.push_back(2);
    vect.push_back(3);
    vect.push_back(4);
    vect.push_back(5);
    vect.push_back(6);
    vect.push_back(7);

    mw.assign(vect.begin(), vect.end());

    std::for_each(mw.container().begin(), mw.container().end(), print<int>);
}

输出:

1 2 3 4 5 6 7 

关于C++ 为容器编写分配过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4298403/

相关文章:

c++ - 模板化类中模板化成员函数的特化

c++ - 如何检查 cin 在 C++ 中是否为 int?

C++ 函数写得不好,不知道如何简化它[初学者]

c++ - 无效使用不完整类型 'class …' STL vector

c++ - 分段故障

c++ - 需要帮助理解 c++ .h 文件

c++ - doxygen 正在生成空文档

c - 在 C 中将未初始化的二维数组作为参数传递

c++ - 引用传递的参数的行为类似于拷贝

c++ - STL 中的 vector 与列表