2017-08-25 32 views
1

我需要在我的程序中使用投射。我在我的代碼的標題,在我的基類動態鑄造的侷限性是什麼?

scSupervisor* msSupervisor; ///< My Supervisor 

,我想在相同的標題來創建一個訪問函數,在派生類中

Supervisor* Supervisor_Get(void){ return (Supervisor*)msSupervisor;} 
             //dynamic_cast<Supervisor*>(msSupervisor);} 

如圖所示,靜態鑄造編譯和運行良好。但是,如果我更改爲動態演員版本(顯示註釋),則顯示錯誤消息:

cannot dynamic_cast '((Core*)this)->Core::<anonymous>.scCore::msSupervisor' (of type 'class scSupervisor*') to type 'class Supervisor*' (target is not pointer or reference to complete type) 
        dynamic_cast<Supervisor*>(msSupervisor);} 
                 ^

在我看來,它是一個指針。我做違法的事嗎?

+8

此代碼是否看到「Supervisor」的完整聲明?看到我強調錯誤消息:_「目標不是指針或引用**完整類型**」_。 – user0042

+0

看到這個答案https://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used – Clonk

回答

2

雖然dynamic_cast<T>具有多個限制,一個是有關您的情況在C++標準的5.2.7.1節描述:

表達dynamic_cast<T>(v)的結果是將所述表達v的結果鍵入TT應的指針或引用到一個完整的類型,或「指向cv void」。

注爲類類型的要求是在上述說明中完整

就你的情況而言,TSupervisor*,根據錯誤消息,它不是指向完整類的指針(即指向已向前聲明但未完全指定的類的指針)。

包含Supervisor的頭文件將解決此問題。

+0

我有一個#包括「scSupervisor .h「在我的腦海中。不過,後來我還有「班級主管,班主任」;也許這會讓編譯器感到困惑?無論如何,我將函數體移至.cpp文件,並且一切正常。 – katang

+0

@katang當標題中的代碼發生此錯誤時,最可能的原因是標頭警衛使該定義不可見。將代碼移至cpp文件通常可以解決此問題,因爲可以使用來自兩個頭文件的定義。 – dasblinkenlight