gpt4 book ai didi

c++ - 使用 vector 迭代器不匹配 ‘operator=’

转载 作者:行者123 更新时间:2023-11-30 01:19:43 28 4
gpt4 key购买 nike

我正在开发一个 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 的函数,每次调用计时器时都会调用该函数,并接收一个带有用户决定的标签名称的字符串(以标记不同的进程)。然后,此函数将检查此标记之前是否已被使用,以便将时间与该进程之前使用的时间相加。因此,它必须检查结构可能必须检查的每个子项,并且我使用迭代器,因为我将在 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;
}
}

但是在编译 g++ 时在 for 行中提示

../src/include/timer.h:73:46: error: no match for ‘operator=’ in ‘it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* with _Iterator = const opice::Global_Timer::TimerNode*, _Container = std::vector, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = const opice::Global_Timer::TimerNode& = actual_timer->opice::Global_Timer::TimerNode::children.std::vector<_Tp, _Alloc>::begin with _Tp = opice::Global_Timer::TimerNode*, _Alloc = std::allocator, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer = opice::Global_Timer::TimerNode**’

我一直在寻找解决方案,我找到了一些解决方案,例如 this这似乎与我遇到的问题几乎相同,但它并没有解决,因为我遇到了完全相同的错误。

我还看到了一些与匹配运算符相关的其他问题,但它们似乎与我的问题不太相似。你能指出我在哪里犯了错误或者我在这里错过了什么吗?我猜它与重载运算符有关,但我无法弄清楚如何在我的结构中重载 = 运算符以解决 vector 迭代器的问题。非常感谢。

最佳答案

问题出在你的for语句,你写的地方

*it=actual_timer->children.begin()

代替

it=actual_timer->children.begin()

你得到一个编译错误因为*it意思是“取消引用名为 it 的迭代器”,它为您提供了对 TimerNode 的引用.因为,希望没有TimerNode::operator=(const std::vector<TimerNode>::iterator&)已定义,您会收到错误。

此外,您正在取消引用一个未初始化的指针,因此如果您编写 *it = SomeTimerNode你不会有编译错误,但你会被扔进未定义的行为领域。

关于c++ - 使用 vector 迭代器不匹配 ‘operator=’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20491273/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com