1

我覺得我的問題很簡單而明確:如何正確地從基類的重載轉換繼承

我有基類AbstractMatrix,和Matrix它的子類,我想使簡單的換算:

namespace mtrx { 
/* mycode */ 
    class AbstractMatrix { 
     public: 
     /* -//- */ 
     operator Matrix(); 
     /* -//- */ 
    } 
    class Matrix : public AbstractMatrix { 
    /* -//- */ 
    } 
} 

AbstractMatrix.cpp:

AbstractMatrix::operator Matrix(){ 
    return Matrix(data); 
} 

編譯器爲消息:

Matrix.h:39:12: error: expected type-specifier before ‘Matrix’ 
    operator Matrix(); 
      ^

我做錯了什麼? 是否有可能進行此類轉換?我想是的,因爲我只想讓基於超,但沒有任何枯燥的語法構造,我需要它隱含

謝謝

+0

我更好奇你爲什麼需要這樣做?運營商應該解決什麼問題?你不能有一個虛擬的「getter」函數返回一個'AbstractMatrix'指針嗎?或者可能使用[CRTP](https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)來了解子類? –

+2

至於你的問題,你*確實知道符號必須在使用符號之前聲明(或者有時甚至定義)*例如foo(矩陣A)的 –

+0

;如果我做這樣的foo(B),其中B是AbstractMatrix,則B將被轉換爲Matrix類。感謝您的建議,我最近開始學習C++,我會閱讀關於虛擬功能和CRTP,可能會幫助我。 – verganz

回答

5

您應該簡單地提供一個向前聲明

namespace mtrx { 

    class Matrix; // <=== here 

    class AbstractMatrix { 
     public: 
     operator Matrix(); 
    }; 

    class Matrix : public AbstractMatrix { 

    }; 

} 

使Matrix可見AbstractMatrix類。


P.S.你應該重新考慮你的設計,因爲有一個轉換操作符將基類轉換爲派生類對我來說看起來很奇怪。

+0

哦,我試圖在命名空間上面執行它。關於設計是的,我認爲你的評論是適當的,但更多的是好奇它爲什麼不起作用 – verganz