2017-12-21 14 views
-1

私は、継承されたクラスで演算子のオーバーロードを回避しています。オーバーロードされた演算子を1つのクラス(以下の例では+)に定義するとうまく動作します。しかし、私は([])それが多型で動作させることができない - 私はここでエラーメッセージ多態性とオーバーロードされた演算子

main.cpp:70:36: error: ‘int A::operator[]() const’ must take exactly one argument 
    virtual int operator[]() const = 0; 
            ^
main.cpp:80:28: error: ‘int B::operator[]() const’ must take exactly one argument 
    virtual int operator[]() const { return b; } 
          ^~~~~ 
main.cpp: In function ‘int main()’: 
main.cpp:90:25: error: expected primary-expression before ‘]’ token 
    std::cout << (*a_ptr)[] << "\n"; 

を取得するコードがある:それは正確に一つの引数を取る必要がありますので、

#include <iostream> 

class A 
{ 
public: 
    A(){}; 
    virtual ~A(){}; 
    virtual int operator[]() const = 0; 
}; 

class B : public A 
{ 
private: 
    int b; 

public: 
    B(int b_) : b(b_){}; 
    virtual int operator[]() const { return b; } 
    int operator+(const B &rhs) const { return b + rhs.b; } 
    int get() { return b; } 
}; 

int main() 
{ 

    ///this gives an error: 
    A *a_ptr = new B(100); 
    std::cout << (*a_ptr)[] << "\n"; 

    ///this works fine 
    B a(10), b(100); 
    std::cout << a.get() << "\n"; 
    std::cout << b.get() << "\n"; 
    b = a + b; 
    std::cout << b.get() << "\n"; 

    return 0; 
} 

[]演算子は特別です?

+5

問題は多型性とは関係ありません。あなたは*エラーメッセージを*読みましたか?それは何と言いますか?そして、インデックスを提供せずに "* index * operator"をどのように使用しますか?演算子のオーバーロードを使用して言語の構文を変更することはできません。おそらく関数呼び出し演算子( 'operator()')のオーバーロードについて考えるべきでしょうか? –

+0

私は少し混乱しています。あなたは演算子+でそれを正しくやっています - あなたはそれを1つの引数として与えます。なぜ演算子[]で同じことをしないのですか?インデックスの引数が1つ必要です - []の間に何かがある必要があります) – user2328447

+0

@ user2328447実際、 'operator +'関数は実際には*正しく実装されました。値で 'B'を返します。演算子のセマンティクスを変更することは無効ではありませんが、そうすることはお勧めしません。たとえば、今のところできません。 'some_b_object + another_b_object + a_third_b_object'となる。 –

答えて

2

thisの説明によると、配列添字演算子には引数も必要です。この引数もエラーメッセージで示されます。アレイサブスクリプト演算子では、明らかに異なるシグネチャは不可能です。

関連する問題