使用自定义强制转换运算符向上转换为模板类

时间:2013-07-12 03:50:06

标签: c++ templates operator-overloading upcasting

我有一个继承自两个类的类,一个是我自己的基类,还有一个模板类:

typedef typename cusp::csr_matrix< int,
                                   float,
                                   cusp::host_memory > csr_matrix;

class CuspMatrix
: 
  public csr_matrix,
  public Matrix
{
...
}

在某些时候,我必须做一个赋值,它会将基类对象从主机复制到设备,如下所示:

cusp::csr_matrix<int,float,cusp::host_memory> A(4,3,6);
cusp::csr_matrix<int,float,cusp::device_memory> A = B;

但在我能够做到这一点之前,我必须将我的这个更新到其基类 csr_matrix

我尝试使用 static_cast 和自定义强制转换运算符:

operator csr_matrix()
{
  return *( cusp::csr_matrix< int,float,cusp::device_memory> *)this;
}

然而,当我尝试做实际的事情时,我从编译器中得到了大量的错误

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *(csr_matrix *)this;

事实上,静态铸造在这一点上也超出了我的范围:

auto me = static_cast<csr_matrix>( *this );
cusp::csr_matrix<int,float,cusp::device_memory> mtx = me;

然而,没有typedef的C风格霰弹枪似乎有效:

auto me = *( cusp::csr_matrix< int,
                               float,
                               cusp::host_memory> *)this;

但是使用typedef失败了:

auto me = *( csr_matrix *)this;
  • 那么,我如何使用我自己的自定义运算符安全地向上投射,最好是 使用静态演员?

  • 为什么使用完整名称空间::类型进行投射仍然有效,但是使用typedef失败了?

1 个答案:

答案 0 :(得分:1)

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *(csr_matrix *)this;

此强制转换永远不能调用转换函数,因为强制转换表达式的操作数this的类型为CuspMatrix*。仅当操作数的类型是类类型时才会考虑转换函数:

cusp::csr_matrix<int,float,cusp::device_memory> mtx = (csr_matrix)*this;

在这种情况下,csr_matrix已经是CuspMatrix的公共基类 - 因此永远不能调用转换函数CuspMatrix::operator csr_matrix()

此向上转化不需要广告投放 - 当this类型为CuspMatrix*cusp::csr_matrix<int,float,cusp::device_memory>支持cusp::csr_matrix<int,float,cusp::host_memory>分配时,您应该可以执行此操作:

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *this;

如果没有看到实际的错误消息和可编辑的示例,则很难回答第二个问题。