C ++模板类继承和运算符使用

时间:2011-11-09 02:14:02

标签: c++ templates operators

我有一个定义运算符的模板类,它可以处理模板参数。 我有另一个继承自这个类的类,我希望运算符当然是继承的。

考虑一下:

template <typename T>
class A
{
public:
  A(const T& x) : x_(x) {}
  A operator-(const A& other) 
  { 
    A r(*this);
    r.x_ -= other.x_;
    return r;
  }

  T x() const { return x_; }

private:
  T x_;
};

template <typename T>
class B : public A<T>
{
  // additional stuff here
};

我似乎无法使用A中声明的任何运算符来表示B类对象。

示例:

int main()
{
  // Fine
  A<int> a(5);
  A<int> b(2);
  A<int> c = a - b;
  std::cout << c.x() << std::endl;

  // Won't compile :( 
  B<int> d(5);
  B<int> e(2);
  B<int> f = d - e;
  std::cout << f.x() << std::endl;

  return 0;
}

将触发以下错误:错误:从'A'转换为非标量类型'B'请求

这有什么办法可行吗?我真的想避免在B类中重写所有代码(完全相同)。

谢谢!

2 个答案:

答案 0 :(得分:3)

问题不在于调用运算符,而是从返回值B构建A

如果B不包含基类A以外的任何数据,则可以从B提供A的构造函数:

template <typename T>
class B : public A<T>
{
public:
     B(const T& x) : A<T>(x) {}
     B(const A<T>&x) : A<T>(x) {}
  // additional stuff here
};

如果B确实包含自己的数据,那么您当然需要实施operator-来处理这些数据字段吗?

答案 1 :(得分:0)

当我尝试这个时,visual studio会给我错误cannot convert from 'A<T>' to 'B<T>'

所以我尝试将变量f的类型从B<int>更改为A<int>并正确编译。这就是我所拥有的:

int main()
{
  // Fine
  A<int> a(5);
  A<int> b(2);
  A<int> c = a - b;
  std::cout << c.x() << std::endl;

  // does compile :)
  B<int> d(5);
  B<int> e(2);
  A<int> f = d - e;
  std::cout << f.x() << std::endl;

  return 0;
}

但是,我认为这不是您想要的,因为如果您找到了将B从B转换为A的方法,您会发现所有特定于B的数据成员都已被删除。如果你考虑一下处理器在做什么,这是有道理的。当它看到operator-的返回类型是A时,它会返回sizeof(A)个字节的数据。除此之外的任何额外数据(例如与B相关联的数据)都将被切断。因此,为了安全起见,如果您尝试将返回值放入B类变量中,编译器会告诉您运气不好。