我有一个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 `*(¤tElement)->std::_List_iterator<_Tp>::operator-> [with _Tp = void*]()', which is of non-class type `void*'
类型转换getPosition()
到label
类型不起作用。另外,我的迭代器的类型为void*
。
答案 0 :(得分:1)
我认为问题在于行
currentElement->getPosition();
不起作用,因为currentElement
是void*
以上的迭代器,而不是label
s。由于某些类型T
上的迭代器的行为类似T*
s,这意味着您的currentElement
迭代器的行为类似于label**
,因此编写上述代码与编写类似
(*currentElement).getPosition();
此处,问题应该更容易看到 - *currentElement
是label*
,而不是label
,因此您不能在其上使用点运算符。< / p>
要解决此问题,请尝试将此代码更改为
((label *)(*currentElement))->getPosition();
取消引用迭代器并对void*
进行类型转换以获得label*
,然后使用箭头运算符调用指向的getPosition()
上的label
函数。 / p>
答案 1 :(得分:0)
您的迭代器类型似乎是根据std::list<void*>::iterator
声明的。这对我来说听起来不对......