Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在模板中定义迭代器?_C++_Templates_Map_Iterator_Erase - Fatal编程技术网

C++ 如何在模板中定义迭代器?

C++ 如何在模板中定义迭代器?,c++,templates,map,iterator,erase,C++,Templates,Map,Iterator,Erase,我试图定义一个迭代器来迭代我的映射以删除它(析构函数) 我得到一个错误:不兼容的迭代器 我的析构函数如下所示: Consortium<S,T>::~Consortium() { map<const S, Node<T>*>::iterator deleteIterator; for (m_consortiumMap.begin() ; deleteIterator != m_consortiumMap.end() ; deleteI

我试图定义一个迭代器来迭代我的映射以删除它(析构函数)
我得到一个错误:不兼容的迭代器

我的析构函数如下所示:

Consortium<S,T>::~Consortium()  
{  
    map<const S, Node<T>*>::iterator deleteIterator;  
    for (m_consortiumMap.begin() ; deleteIterator != m_consortiumMap.end() ; deleteIterator++)  
      m_consortiumMap.erase(deleteIterator);  
}  
Consortium<string, Vehicle*> check;  
Consortium::~Consortium()
{  
迭代器deleteIterator;
对于(m_consortiumMap.begin();deleteIterator!=m_consortiumMap.end();deleteIterator++)
m_consortiumMap.erase(删除迭代器);
}  
我这样创造:

Consortium<S,T>::~Consortium()  
{  
    map<const S, Node<T>*>::iterator deleteIterator;  
    for (m_consortiumMap.begin() ; deleteIterator != m_consortiumMap.end() ; deleteIterator++)  
      m_consortiumMap.erase(deleteIterator);  
}  
Consortium<string, Vehicle*> check;  
联合体检查;

有什么建议吗?

改用
map

改用
map

你眼前的问题是
map::iterator
是一个所谓的依赖名:它取决于模板参数,理论上,对于一些
S
,可能有
std::map
的特殊化,
T
它将
迭代器定义为静态数据成员、成员函数的名称或任何内容。它是什么,编译器只有在实例化模板时才会发现。因此,您必须向编译器解释,
iterator
是类型的名称,从而帮助编译器。(我知道这很愚蠢,但编译器真的那么愚蠢)。您可以将
typename
放在它前面:

typename map<const S, Node<T>*>::iterator deleteIterator;
typename映射::迭代器deleteIterator;
然而,你实际上所做的是错误的。您不需要手动删除地图宿主的元素。但是

您正在使用裸指针作为映射的引用类型。谁拥有这些物品?谁负责删除它们?您可能需要浏览地图并(而不是删除指针)删除这些指针所引用的对象。但这很容易出错,并且仍然留下了关于对象生命周期的未决问题。(例如:谁对从地图上删除的对象负责?

我强烈建议您遵循并使用智能指针

您眼前的问题是,
map::iterator
是一个所谓的依赖名称:它取决于模板参数,理论上,对于一些
S
T
,它将
iterator
定义为静态数据成员,成员函数的名称或其他名称。它是什么,编译器只有在实例化模板时才会发现。因此,您必须向编译器解释,
iterator
是类型的名称,从而帮助编译器。(我知道这很愚蠢,但编译器真的那么愚蠢)。您可以将
typename
放在它前面:

typename map<const S, Node<T>*>::iterator deleteIterator;
typename映射::迭代器deleteIterator;
然而,你实际上所做的是错误的。您不需要手动删除地图宿主的元素。但是

您正在使用裸指针作为映射的引用类型。谁拥有这些物品?谁负责删除它们?您可能需要浏览地图并(而不是删除指针)删除这些指针所引用的对象。但这很容易出错,并且仍然留下了关于对象生命周期的未决问题。(例如:谁对从地图上删除的对象负责?

我强烈建议您遵循并使用智能指针

需要更多信息-您在哪里定义了迭代器,例如,我想您需要一个
typename
。只是好奇为什么不使用map::clear(),它做同样的事情并且更优雅…如果您可以使用C++0x功能,您可以只使用
auto
。1)您需要
typename
,因为
t
是一个依赖类型。2) 您从不分配
删除迭代器
。3) 只需使用
clear()
。4) 什么都不要做,它会自动清除的。5) 一切都应该自动发生,所以如果应该删除,请使用智能指针。需要更多信息-您在哪里定义了迭代器,例如,我想您需要一个
typename
。只是好奇为什么不使用map::clear(),它做同样的事情,而且更优雅…如果您可以使用C++0x功能,您可以只使用
auto
.1)您需要
typename
,因为
T
是一个依赖类型。2) 您从不分配
删除迭代器
。3) 只需使用
clear()
。4) 什么都不要做,它会自动清除的。5) 一切都应该自动发生,所以如果应该删除这些,请使用智能指针。