我正在开发一个Timer类,它使用通用树来存储不同的进程时序。这个结构有字符串和双变量来存储标签和这个“标签”消耗的时间(每个标签对应一些真正的过程)。这是定义:
struct TimerNode
{
double time_value;
std::string name;
std::vector<TimerNode*> children;
TimerNode(){};
TimerNode(const std::string name): name(name){}
TimerNode& operator=(const TimerNode& other){//CopyAssignable
this->time_value=other.time_value; this->name=other.name;
return *this;}
TimerNode(const TimerNode& other){//CopyConstructible
this->time_value=other.time_value; this->name=other.name;}
}tree_;
此结构位于计时器类中,它将使用它来维护每个进程使用的时间记录。它还有一个名为open_register的函数,每次调用计时器时都会调用它,并接收一个字符串,其中包含用户决定的标记名称(用于标记不同的proccesses)。然后,此函数将检查此标记之前是否已用过,以便总结该进程之前使用时间的时间。因此,它必须检查结构可以检查的每个子节点,并且我使用迭代器,因为我将在std :: vector子节点内搜索。所以
TimerNode* actual_timer = &open_timers_.back(); //open_timers is a stack
std::vector<TimerNode>::iterator it;
for(*it=actual_timer->children.begin(); it != actual_timer->children.end(); ++it){
if(it->name == received_name){//we found it.
/*At this point we need to put the node associated with this
* into the stack and start counting because it is a child
* that was used before but stopped. So we will add the time
* expended this time to the value it already has.*/
open_timers_.push_back(*it);
break;
}
}
然而,当在for行中编译g ++抱怨说
时../ src / include / timer.h:73:46:错误:'it .__ gnu_cxx :: __ normal_iterator&lt; _Iterator,_Container&gt; :: operator * with _Iterator = const opice中的'operator ='不匹配: :Global_Timer :: TimerNode *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator&lt; _Iterator,_Container&gt; :: reference = const opice :: Global_Timer :: TimerNode&amp; = actual_timer-&gt; opice :: Global_Timer :: TimerNode :: children.std :: vector&lt; _Tp,_Alloc&gt; ::以_Tp = opice :: Global_Timer :: TimerNode *开头,_Alloc = std :: allocator,std :: vector&lt; _Tp,_Alloc&gt; :: iterator = __gnu_cxx :: __ normal_iterator&gt;,typename std :: _ Vector_base&lt; _Tp,_Alloc&gt; :: _ Tp_alloc_type :: pointer = opice :: Global_Timer :: TimerNode **'
我一直在寻找解决方案,我发现其中一些像this这似乎与我的问题几乎相同,但它没有解决它,因为我有同样的错误。
我还看到了一些与匹配运算符相关的其他问题,但它们似乎与我的问题不太相似。你能指出我犯错的地方或我错过的地方吗?我想它与重载运算符有关,但我无法弄清楚如何在我的struct中重载=运算符以便用向量迭代器修复问题。非常感谢你。
答案 0 :(得分:2)
删除星号:
for(it=actual_timer->children.begin(); it != actual_timer->children.end(); ++it) {
*it = actual_timer->children.begin()
尝试将actual_timer->children.begin()
分配给it
指向的元素。 it
指向的元素本身不是迭代器,因此也就是编译错误。此外,it
当时未初始化,因此即使编译成功,访问它指向的元素也会调用未定义的行为。
答案 1 :(得分:2)
问题出在你的for
语句中,你写的是
*it=actual_timer->children.begin()
而不是
it=actual_timer->children.begin()
您收到编译错误,因为*it
表示“取消引用名为it
的迭代器”,它为您提供TimerNode
的引用。因为希望没有定义TimerNode::operator=(const std::vector<TimerNode>::iterator&)
,所以你会收到错误。
此外,您正在取消引用非初始化指针,因此如果您已编写*it = SomeTimerNode
,您将没有编译错误,但您将被抛入未定义的行为域。
答案 2 :(得分:1)
你错放了it
前面的解除引用运算符;要分配给迭代器,只需使用它的变量,而不是它指向的元素。
vector<int> v { 1, 2, 3 };
auto it = v.begin();
cout << *it; // prints 1
it = v.begin() + 1;
cout << *it; // prints 2;
*it = 3;
cout << *it; // prints 3; v contains [1,3,3] now