2016-07-12 3 views
4
#include <iostream> 
#include <algorithm> 

struct Node 
{ 
    int value_; 
    Node* next_; 

    Node(int value, Node* next = nullptr) 
     : value_(value) 
     , next_(next) 
    {} 
}; 

Node* operator++(Node* node) 
{ 
    node = node->next_; 
    return node; 
} 

int operator*(Node* node) 
{ 
    return node->value_; 
} 

int main() 
{ 
    Node* first = new Node(10); 
    first->next_ = new Node(20); 
    first->next_->next_ = new Node(17); 

    Node* endIter = nullptr; 

    std::cout << std::accumulate(first, endIter, 0) << std::endl; 
} 

この例では、リストのイテレータとしてNode*を使用しようとしました。私は、ポインタのためoperator++operator*をオーバーロードすることはできませんようにリストのイテレータとして `Node * 'を使用する

1 main.cpp:15:28: error: Node* operator++(Node*) must have an argument of class or enumerated type 
    2 Node* operator++(Node* node) 
    3       ^
    4 main.cpp:21:25: error: int operator*(Node*) must have an argument of class or enumerated type 
    5 int operator*(Node* node) 

が見えるコンパイルエラーを取得しています。

このオーバーロードを書籍Stroustrup: The C++ Programming Language (4th Edition) pg 703からコピーしました。

誰でも私が間違ったことを説明できますか?

答えて

3

std::accumulateへの入力は、InputIteratorの要件を満たす必要があります。

InputIteratorの要件の1つは、プリインクリメント演算子をサポートすることです。

Node*でプリインクリメント演算子を使用できますが、組み込みロジックを使用してポインタをインクリメントします。

Node* operator++(Node* node) { ... } 

は、引数の型がNode*であるため無効です。 Nodeの場合はoperator++にオーバーロードできますが、Node*の場合はオーバーロードできません。 C++ 11標準(強調鉱山)から

:オペレータ

6オペレータ関数が非静的メンバ関数であるか、非会員でなければならないのいずれかのオーバーロード

13.5 には、型がクラス、クラスへの参照、列挙型または列挙型への参照である少なくとも1つのパラメータがあります

+0

しかし、私は[OK]を、あなたは氏Stroustrup氏はそれを行ったかを説明することができます 'ノード*' – Ashot

+1

の事前増分をオーバーロードしていますか?ここには本のリンクがあります。 https://www.dropbox.com/s/ipo5pkud6j4vr30/Straustrup4th.pdf?dl=0 – Ashot

+0

@Ashot、この本では 'double ad [] = {1,2,3,4}; double s1 =累積(ad、ad + 4,0.0);double s2 = accumulate(ad、ad + 4,0); '。これらは完全に有効なイテレータです。 –

0

プリミティブ型またはポイントの演算子をオーバーロードすることはできません。だから、Nodeのイテレータを書くべきです。

class iterator { 
public: 
    iterator(Node *node): _node(node) {} 
    iterator operator++() { 
    _node = _node->next; 
    return *this; 
    } 
    iterator operator++(int) { 
    iterator tmp = *this; 
    ++(*this); 
    return tmp; 
    } 
    bool operator == (const iterator &iter) const { 
    return _node == iter._node; 
    } 
    int operator*() { 
    return _node->value; 
    } 
private: 
    Node *_node; 
}; 
関連する問題