2015-07-11 53 views
2

我正在嘗試一個虛擬模板函數的實現。我在將this指向指向子類模板的指針時有工作,但是當我將*this引用到子類時,我無法使其工作,爲什麼?C++ bad_cast異常鑄造*這個派生模板類

template <typename T> struct BB; // forward reference (not bound until instantiation in main) 
struct AA 
{ 
    virtual ~AA(){} 
    template <typename T> 
    void operator()(T && t) 
    { 
     dynamic_cast<BB<T>*>(this)->operator()(std::forward<T>(t)); // works! 
     dynamic_cast<BB<T>&>(*this)(std::forward<T>(t));   // compiles but throws bad_cast 
    } 
}; 
template <typename T> 
struct BB : AA 
{ 
    void operator()(T t) { std::cout << "BB::operator()" << std::endl; } 
}; 

int main() 
{ 
    BB<int> bb; 
    int k = 5; 
    static_cast<AA&>(bb)(k); 
} 
+0

「作品」是什麼意思? –

+0

請同時嘗試'static_cast (bb)(5);':-) –

+0

@KerrekSB,調用'void BB :: operator()(T&t)' – ThomasMcLeod

回答

4

在您的呼叫static_cast<AA&>(bb)(k);T推導爲int &,以及含有*this最派生的對象是BB<int &>類型不是。所以兩個強制轉換失敗,並且你的指針間接產生未定義的行爲。

+0

值得一提的是,在這種情況下「未定義的行爲」似乎*做正確的事情。由於OP正在調用一個不訪問它自己的對象的函數,即使this == nullptr(它是由指針的動態強制轉換返回的),函數也會打印預期的結果。 –

+1

這很有趣。此修復程序是否按照OP的預期工作? http://ideone.com/5Cahf7 –

+0

@DanielJour,當然我們也可以'remove_cv'。 – ThomasMcLeod