自定义STL容器包装器报告奇怪的编译器错误

时间:2011-02-12 00:15:35

标签: c++ stl iterator wrapper

我有一个C ++库(包含50多个源文件),它使用了许多STL例程,主要容器为listvector。这导致了巨大的代码膨胀,我想通过创建另一个本质上是包装器的库来减少代码膨胀 超过listvector

我基本上需要一个围绕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 个答案:

答案 0 :(得分:1)

我认为问题在于行

currentElement->getPosition();

不起作用,因为currentElementvoid*以上的迭代器,而不是label s。由于某些类型T上的迭代器的行为类似T* s,这意味着您的currentElement迭代器的行为类似于label**,因此编写上述代码与编写类似

(*currentElement).getPosition();

此处,问题应该更容易看到 - *currentElementlabel*,而不是label,因此您不能在其上使用点运算符。< / p>

要解决此问题,请尝试将此代码更改为

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

取消引用迭代器并对void*进行类型转换以获得label*,然后使用箭头运算符调用指向的getPosition()上的label函数。 / p>

答案 1 :(得分:0)

您的迭代器类型似乎是根据std::list<void*>::iterator声明的。这对我来说听起来不对......