2017-04-13 43 views
-1
麻烦

我有一个迭代器类,它定义了++运算符:错误C2676;具有限定++运算符的二叉搜索树类在C++

template<typename T> 
class Iterator : public std::iterator<std::forward_iterator_tag, T> 
{ 
public: 
    Iterator(TreeNode<T>* p) 
    { 
     if (p == nullptr) 
      current = -1; // The end 
     else 
     { 
      // Get all the elements in inorder 
      treeToVector(p); 
      current = 0; 
     } 
    } 

    Iterator operator++() 
    { 
     current++; 
     if (current == v.size()) 
      current = -1; // The end 
     return *this; 
    } 

    T& operator*() 
    { 
     return v[current]; 
    } 
    bool operator==(const Iterator<T>& iterator) const 
    { 
     return current == iterator.current; 
    } 
    bool operator!=(const Iterator<T>& iterator) const 
    { 
     return current != iterator.current; 
    } 

private: int current; 
     vector<T> v; 
     void treeToVector(TreeNode<T>* p) 
     { 
      if (p != nullptr) 
      { 
       treeToVector(p->left); 
       v.push_back(p->element); 
       treeToVector(p->right); 
      } 
     } 
}; 

我有一个TestBSTIterator文件,以确保它的工作原理:

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <algorithm> 
#include "BST.h" 

using namespace std; 

string toUpperCase(string& s) 
{ 
    for (size_t i = 0; i < s.length(); i++) 
     s[i] = toupper(s[i]); 
    return s; 
} 

int main() 
{ 
    // Create a binary search tree for strings 
    BST<string> tree; 

    // Add elements to the tree 
    tree.insert("America"); 
    tree.insert("Canada"); 
    tree.insert("Russia"); 
    tree.insert("France"); 

    // Traverse a binary tree using iterators 
    for (Iterator<string> iterator = tree.begin(); 
     iterator != tree.end(); iterator++) 
    { 
     cout << toUpperCase(*iterator) << " "; 
    } 

    cout << endl << "Min element is " << 
     *min_element(tree.begin(), tree.end()) << endl; 

    cout << "Max element is " 
     << *max_element(tree.begin(), tree.end()) << endl; 

    return 0; 
} 

当我尝试运行TestBSTIterator我得到以下错误:

错误C2676:二进制“++”:“游标”不定义这种操作或转换到类型接受的预先规定的操作

1>使用

1> [

1> T =的std :: string

1>]

我有 “操作符++” 功能的迭代器类,所以我不太了解问题所在。我试着简单地用一个泛型类型实现函数,即迭代器运算符++(){...}但是没有效果。

回答

1

你定义Iterator operator++(),这是前缀运营商(++iterator),但是你用iterator++,该后缀运营商,这与Iterator operator++(int)定义。 int通常是未使用的,仅用于区分两个增量运算符。

在代码中使用++iterator,或者定义postfix操作符。

+0

好抓。感谢那! – so8857