2013-07-12 86 views
0

到模板類我有一個類從兩個班,一個是我自己的基類繼承和模板類:了鑄造使用自定義類型轉換操作符

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失敗?

+1

你的類從'csr_matrix <整型,浮點,尖點:: host_memory>'衍生,但你嘗試將它轉換爲'csr_matrix <整型,浮點,尖點:: device_memory>'。這不是真正的投影 - 它是投射到一個不相關的類型(據我所知)。 – jogojapan

+0

不,typedef是csr_matrix ,但你是對的,上面的代碼是錯誤的。從cusp :: host_memory到cusp :: device_memory的分配是一個不同的故事,可以從一個到另一個完成。 –

+0

關於基於typedef的轉換,即'auto me = *(csr_matrix *)this;':這個問題可能是由於代碼「csr_matrix」中的這一點不僅指的是typedef-name也是原始模板名稱'cusp :: csr_matrix'。這可能是類名注入和繼承的結果。您是否嘗試過使用typedef的不同名稱? – jogojapan

回答

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(),永遠不能被調用。

這個向上轉換並不需要強制 - 當thisCuspMatrix*型和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; 

沒有看到實際的錯誤消息和一個可編輯的例子,很難回答第二個問題。

+0

因此隱式轉換應該可以正常工作嗎?請記住,基類是cusp :: csr_matrix 您正在執行的任務是從一種類型複製到另一種類型,但我猜你的意思是host_memory模板參數。 –