C ++ пишет процедуру назначения для контейнера - PullRequest
1 голос
/ 28 ноября 2010

У меня есть контейнер, класс, и я хотел бы предоставить ему метод присвоения, аналогичный 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: в функции 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 rereents класс Workflow в workflow.hpp и workflow.cpp ... TaskDescriptor - это элемент в векторе (тип в коллекции в myclass).

Знаете ли вы, почему это происходит?

Я подозреваю, что в моем классе должен быть какой-то оператор для перегрузки, чтобы этот механизм работал правильно .... потому что проблема не в реализации метода, даже если я пишу

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

При вызове вызывает то же самое "исключение".

1 Ответ

1 голос
/ 28 ноября 2010

То, что у вас есть, - это не ваш собственный контейнер, а оболочка контейнера.

Но я вижу только одну проблему с вашим кодом: в вашем определении myclass::assign не указан тип возвращаемого значения.1005 * Этот код на самом деле работает для меня:

#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 
...