我有一个继承自两个类的类,一个是我自己的基类,还有一个模板类:
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失败了?
答案 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;
如果没有看到实际的错误消息和可编辑的示例,则很难回答第二个问题。