以下是导致错误的代码:
Factory.h:
#include <string>
#include <map>
namespace BaseSubsystems
{
template <class T>
class CFactory
{
protected:
typedef T (*FunctionPointer)();
typedef std::pair<std::string,FunctionPointer> TStringFunctionPointerPair;
typedef std::map<std::string,FunctionPointer> TFunctionPointerMap;
TFunctionPointerMap _table;
public:
CFactory () {}
virtual ~CFactory();
}; // class CFactory
template <class T>
inline CFactory<T>::~CFactory()
{
TFunctionPointerMap::const_iterator it = _table.begin();
TFunctionPointerMap::const_iterator it2;
while( it != _table.end() )
{
it2 = it;
it++;
_table.erase(it2);
}
} // ~CFactory
}
我得到的错误:
error: no matching member function for call to 'erase' [3]
_table.erase(it2);
~~~~~~~^~~~~
任何提示? 谢谢。
答案 0 :(得分:7)
这是C ++ 98中map::erase
的签名:
void erase( iterator position );
此功能需要iterator
,但您传递const_iterator
。这就是代码无法编译的原因。
我该如何解决这个问题?
在C ++ 11中,这甚至不是问题,因此不需要修复。那是因为在C ++ 11中map::erase
函数具有以下签名,因此接受const_iterator
。
iterator erase( const_iterator position );
如果您无法使用新标准,则必须将变量更改为iterator
。
答案 1 :(得分:3)
您正在将const_iterator传递给需要普通迭代器的方法。
答案 2 :(得分:2)
看看大师说的话:
Scot Meyers in Effective STL
项目26.首选迭代器为const iterator,reverse_iterator和const_reverse_iterator。虽然容器支持四种迭代器类型,但其中一种类型具有其他类型没有的权限。该类型是迭代器,迭代器是特殊的。
typedef deque<int> IntDeque; //STL container and
typedef lntDeque::iterator Iter; // iterator types are easier
typedef lntDeque::const_iterator ConstIter; // to work with if you
// use some typedefs
Iter i;
ConstIter ci;
… //make i and ci point into
// the same container
if (i == ci ) ... //compare an iterator
// and a const_iterator
项27.使用distance和advance将容器的const_iterators转换为迭代器。
typedef deque<int> IntDeque; //convenience typedefs
typedef lntDeque::iterator Iter;
typedef lntDeque::const_iterator ConstIter;
ConstIter ci; // ci is a const_iterator
…
Iter i(ci); // error! no implicit conversion from
// const_iterator to iterator
Iter i(const_cast<Iter>(ci)); // still an error! can't cast a
// const_iterator to an iterator
有效的是提前和距离
typedef deque<int> IntDeque; //as before
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;
IntDeque d;
ConstIter ci;
… // make ci point into d
Iter i(d.begin()); // initialize i to d.begin()
Advance(i, distance(i, ci)) //move i up to where ci is
// (but see below for why this must
// be tweaked before it will compile)