到模板類我有一個類從兩個班,一個是我自己的基類繼承和模板類:了鑄造使用自定義類型轉換操作符
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;
然而,沒有類型定義C風格的獵槍投,似乎工作:
auto me = *(cusp::csr_matrix< int,
float,
cusp::host_memory> *)this;
,但失敗了的typedef:
auto me = *(csr_matrix *)this;
所以,我怎麼能放心地了鑄使用我自己的自定義運算符,最好通過 使用靜態轉換?
爲什麼使用完整名稱空間::類型工作,但與typedef失敗?
你的類從'csr_matrix <整型,浮點,尖點:: host_memory>'衍生,但你嘗試將它轉換爲'csr_matrix <整型,浮點,尖點:: device_memory>'。這不是真正的投影 - 它是投射到一個不相關的類型(據我所知)。 – jogojapan
不,typedef是csr_matrix,但你是對的,上面的代碼是錯誤的。從cusp :: host_memory到cusp :: device_memory的分配是一個不同的故事,可以從一個到另一個完成。 –
關於基於typedef的轉換,即'auto me = *(csr_matrix *)this;':這個問題可能是由於代碼「csr_matrix」中的這一點不僅指的是typedef-name也是原始模板名稱'cusp :: csr_matrix'。這可能是類名注入和繼承的結果。您是否嘗試過使用typedef的不同名稱? – jogojapan