我有两个班,一个从其他继承。 基类的相关部分如下(显然这类有构建函数,一个析构函数,等,且特别的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
)。
这会导致一个问题,虽然。 当我去添加两个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
如果两个Polynomial
s的传递给它)。 我想这样做,如果可能的话,没有operator+
了解关于每个和每一个可能子Vector
(我认为这可能是一个合法的愿望是什么?),并且没有发生新的operator+
功能的每个子类(因为我也有其他几个重载操作符,并希望避免复制几乎完全一样的代码十倍每个派生类)。
我知道这是可能的(并且,事实上,比较容易)在Python。 请问C ++支持这样的事情?