-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;
}
は[]
演算子は特別です?
問題は多型性とは関係ありません。あなたは*エラーメッセージを*読みましたか?それは何と言いますか?そして、インデックスを提供せずに "* index * operator"をどのように使用しますか?演算子のオーバーロードを使用して言語の構文を変更することはできません。おそらく関数呼び出し演算子( 'operator()')のオーバーロードについて考えるべきでしょうか? –
私は少し混乱しています。あなたは演算子+でそれを正しくやっています - あなたはそれを1つの引数として与えます。なぜ演算子[]で同じことをしないのですか?インデックスの引数が1つ必要です - []の間に何かがある必要があります) – user2328447
@ user2328447実際、 'operator +'関数は実際には*正しく実装されました。値で 'B'を返します。演算子のセマンティクスを変更することは無効ではありませんが、そうすることはお勧めしません。たとえば、今のところできません。 'some_b_object + another_b_object + a_third_b_object'となる。 –