C++ 使用自定义强制转换操作符向上转换到模板类

C++ 使用自定义强制转换操作符向上转换到模板类,c++,templates,operator-overloading,upcasting,C++,Templates,Operator Overloading,Upcasting,我有一个继承自两个类的类,一个是我自己的基类,另一个是模板类: typedef typename cusp::csr_matrix< int, float, cusp::host_memory > csr_matrix; class CuspMatrix : public csr_matrix, public Matrix { ...

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

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

class CuspMatrix
: 
  public csr_matrix,
  public Matrix
{
...
}
  • 那么,如何使用自己的自定义操作符安全地向上投射,最好是通过 使用静态强制转换?

  • 为什么使用完整名称空间::type进行强制转换有效,但使用typedef失败?

在此场景中,csr_矩阵已经是
CuspMatrix
的公共基类,因此无法调用转换函数
CuspMatrix::operator csr_矩阵()

此向上转换不需要强制转换-当
CuspMatrix*
类型且
cusp::csr_矩阵
支持从
cusp::csr_矩阵
分配时,您应该能够执行以下操作:

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *this;
cusp::csr\u矩阵mtx=*此;

如果看不到实际的错误消息和可编译的示例,就很难回答第二个问题。

您的类来自
csr\u矩阵
,但您尝试将其转换为
csr\u矩阵
。这并不是真正的向上转换,而是转换到一个不相关的类型(据我所知)。不,typedef是csr_矩阵,但你是对的,上面的代码是错误的。从cusp::host_memory到cusp::device_memory的赋值是另一回事,可以从一个到另一个进行赋值:问题可能是因为代码
csr\u矩阵
中的这一点不仅指typedef名称,而且指原始模板名称
cusp::csr\u矩阵
。这可能是类名注入与继承相结合的结果。你试过为typedef使用不同的名称吗?不,我会马上尝试一下。不,我仍然会出错,尽管原因可能不同,所以隐式转换应该可以正常工作?请记住,基类是cusp::csr_matrix您上面所做的赋值是从一种类型复制到另一种类型,但我猜您指的是主机内存模板参数。
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;
auto me = *( cusp::csr_matrix< int,
                               float,
                               cusp::host_memory> *)this;
auto me = *( csr_matrix *)this;
cusp::csr_matrix<int,float,cusp::device_memory> mtx = *(csr_matrix *)this;
cusp::csr_matrix<int,float,cusp::device_memory> mtx = (csr_matrix)*this;
cusp::csr_matrix<int,float,cusp::device_memory> mtx = *this;