【发布时间】:2012-06-28 02:50:45
【问题描述】:
我正在使用 c++,但我遇到的问题是,每次调用以下代码中的方法“getItem()”都会返回 0,尽管这不是写在地图中的整数,而且地图也不是空的。使用“typename...”语句作为类属性有什么问题吗?
template <class t>
class P {
public:
P();
int getItem();
private:
std::map<int, P<t>* > m;
typename std::map<int, P<t>* >::iterator it;
bool visited;
};
template <class t>
P<t>::P() {
visited=false;
}
template <class t>
int P<t>::getItem()
{
if(!visited)
it=m.begin();
int i=it->first;
it++;
return i;
}
方法“getItem()”仅在地图没有更多更改后调用。所以不应该有迭代器无效的原因。我通过调用 m[i]=p 将项目添加到地图中。
感谢您的帮助;)
【问题讨论】:
-
仅此而已?
visited是否初始化为false?如何向map添加元素?您确定iterator仍然有效吗? -
在P的构造函数中将
visited设置为false。我通过为有效整数调用m[i]=p将元素添加到地图中,这些整数永远不会是0和有效的类对象p。在将所有元素添加到地图后,我调用该函数,因此在调用该方法时我不会更改它。还有其他原因导致迭代器不再有效吗? -
您好,欢迎来到 SO!在这样的谜团中,我们经常发现错误出在您不发布的代码中,而不是您发布的代码中。 (毕竟,如果您知道错误在哪里,您就不会在这里,对吗?)请将您的原始程序缩减为显示错误的最小完整程序(通常是 20 行或所以)。然后将该整个程序复制粘贴到问题中。请参阅sscce.org 了解更多信息。
-
@Heusi 您从未将
visited设置为true,在每次调用getItem()时,迭代器都设置为begin()。您可以在构造函数中初始化迭代器并完全摆脱visited。