Пользовательская оболочка контейнера STL сообщает о странной ошибке компилятора - PullRequest
0 голосов
/ 12 февраля 2011

У меня есть библиотека C ++ (с более чем 50 исходными файлами), которая использует множество подпрограмм STL с основными контейнерами list и vector. Это вызвало огромное раздувание кода, и я хотел бы уменьшить его, создав другую библиотеку, которая по сути является оберткой над list и vector.

Мне в основном нужна оболочка для std::list, которая отлично работает для контейнера списка любого типа.

Ниже показан мой класс оболочки списка.

template<typename T>
class wlist
{
private:
    std::list<T> m_list;

public:

    wlist();

    typedef std::list<void*>::iterator Iterator;
    typedef std::list<void*>::const_iterator CIterator;

    unsigned int size () { return m_list.size(); }
    bool empty () { return m_list.empty(); }
    void pop_back () { m_list.pop_back(); }
    void pop_front () { m_list.pop_front(); }
    void push_front (const T& item) { m_list.push_front(item); }
    void push_back (const T& item) { m_list.push_back(item); }
    bool delete_item (void* item);
    T& back () { return (m_list.empty()) ? NULL : m_list.back();}
    T& front () { return (m_list.empty()) ? NULL : m_list.front();}
    Iterator erase() { return m_list.erase(); }
    Iterator begin() { return (Iterator) m_list.begin(); }
    Iterator end() { return (Iterator) m_list.end(); }
};

File1.h:

class label{

public:
int getPosition(void);
setPosition(int x);

private:
wlist<text> _elementText; // used in place of list<text> _elementText;

}

File2.h:

class image {

private:

    void draw image() {
        //Used instead of list<label*>::iterator currentElement = _elementText.begin();
        wlist<label*>::iterator currentElement = _elementText.begin();
        currentElement->getPosition(); // Here is the problem.     
        currentElement ++;
    }
}

Вызывает бомбы getPosition () со следующим сообщением об ошибке:

error: request for member `getPosition' in `*(&currentElement)->std::_List_iterator<_Tp>::operator-> [with _Tp = void*]()', which is of non-class type `void*'

Приведение типов getPosition() к label не работает. Кроме того, мои итераторы имеют тип void*.

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Мне кажется, проблема в том, что строка

currentElement->getPosition();

не будет работать, потому что currentElement - это итератор для void* с, а не label с.Поскольку итераторы некоторого типа T действуют как T* s, это означает, что ваш currentElement итератор действует как label**, и поэтому написание приведенного выше кода похоже на написание

(*currentElement).getPosition();

Здесь, проблема должна быть немного легче увидеть - *currentElement это label*, а не label, и поэтому вы не можете использовать оператор точки.

Чтобы исправить это, попробуйтеизменение этого кода на

((label *)(*currentElement))->getPosition();

Это разыменовывает итератор и вводит void*, чтобы получить label*, а затем использует оператор стрелки для вызова функции getPosition() для label, на который указывает.

0 голосов
/ 12 февраля 2011

Похоже, что ваши типы итераторов объявлены в терминах std::list<void*>::iterator. Мне это не кажется правильным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...