C ++为容器编写赋值过程

时间:2010-11-28 18:52:32

标签: 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);
}

确定。好吧,我编译,好吧。 我现在用它了......

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:在函数'void中   中间件:: WorkflowSerializationTest()”:   workflow_test.hpp:114:错误:无效   从类型演员   “__gnu_cxx :: __ normal_iterator

     
    
      

'输入'middleware :: TaskDescriptor *'       workflow_test.hpp:114:错误:无效       从类型演员       “__gnu_cxx :: __ normal_iterator       '输入'middleware :: TaskDescriptor *'

    
  

workflow_test是我调用函数assign的文件,myclass repreents工作流类在workflow.hpp和workflow.cpp中... TaskDescriptor是向量中的元素(myclass中集合中的类型)。

你知道为什么会这样吗?

我怀疑在我的类中必须有一些运算符重载才能让这个机制正常工作....因为即使我写了

也不是方法实现的问题
template < typename InputIterator >
void myclass::assign(InputIterator first, InputIterator last) {
   // NOTHING WRITTEN IN THE BODY
}

调用时会引发相同的“异常”。

1 个答案:

答案 0 :(得分:1)

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

但我发现您的代码只有一个问题:您的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