'vector ='与向量的迭代器不匹配

时间:2013-12-10 10:00:44

标签: c++ vector stl operator-overloading

我正在开发一个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中重载=运算符以便用向量迭代器修复问题。非常感谢你。

3 个答案:

答案 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