2 つのクラスがあり、一方は他方から継承されます。基本クラスの関連部分は次のとおりです(明らかに、このクラスにはctor、dtorなど、特に がありますが、目前operator[]
の問題とは無関係だと思いました):
#include <array>
template < class T, unsigned int N >
class Vector
{
public:
template < class U, unsigned int M > friend Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& );
template < class U, unsigned int M > friend std::ostream& operator<< ( std::ostream&, const Vector< U, M >& );
};
派生クラス (繰り返しになりますが、無関係だと思われる部分を削除したことは明らかです):
#include "Vector.h"
template < class T, unsigned int N >
class Polynomial
: public Vector< T, N >
{
public:
template < class U, unsigned int M > friend std::ostream& operator<< ( std::ostream&, const Polynomial< U, M >& );
};
(注: フレンド関数は、テンプレートにクラスとは異なる文字を使用します。そうしないと、gcc が「シャドウイング」について文句を言うためです。ただし、ロジックは同じです。)
Vector
s 一方向に出力します (例: < 3, 5, 1 >
)。Polynomial
s 別のものを出力します (例: 3 x^2 + 5 x + 1
)。
ただし、これは問題を引き起こします。2 つの を一緒に追加するPolynomial
と、コンパイラは を使用します。template < class U, unsigned int M > Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& )
これはもちろん を返しますVector
。したがって、のようなことをしようとするとstd::cout << poly1 + poly2;
、結果の表示は間違った形式になります。
template < class U, unsigned int M > Vector< U, M > operator+ ( const Vector< U, M >&, const Vector< U, M >& )
パラメータの実際のデータ型を検出し、それに応じて戻り値をキャストするように変更したいと思います (たとえばPolynomial
、2 つPolynomial
の s が渡された場合は a を返します)。可能であれば、可能なoperator+
すべてのサブクラスを知らずにVector
(これはおそらく正当な欲求だと思いますか?)、operator+
サブクラスごとに新しい関数を作成せずに、これを実行したいと思います(他にもいくつかのオーバーロードされた演算子があるため、派生クラスごとにほぼ同じコードを 10 回コピーすることは避けたいと考えています)。
Python ではこれが可能である (そして、実際には比較的簡単である) ことを私は知っています。C++ はそのようなことをサポートしていますか?