2014-04-30 167 views
5
class GAGenome { 
    virtual void method(){}; 
}; 

template <class T> 
class GAArray { 
}; 

template <class T> 
class GA1DArrayGenome : public GAArray<T>, public GAGenome { 
}; 

int main() { 
    GA1DArrayGenome<float> genome; 
    const GAGenome & reference = genome; 
    auto cast = dynamic_cast<const GA1DArrayGenome<int> &>(reference); 
} 

這顯然是錯誤的方案(因爲模板參數是不同的)與如何調試一個std :: bad_cast異常

terminate called after throwing an instance of 'std::bad_cast' 
    what(): std::bad_cast 
Aborted (core dumped) 

崩潰有沒有路怎麼走的什麼地方出了錯精確的診斷,超越運行時錯誤消息?有什麼,可以指出我的int/float錯誤嗎?我要尋找一個描述性錯誤消息像

const GA1DArrayGenome<float> &不能轉換到const GA1DArrayGenome<int> &

更妙的是,因爲C++的類型可以拿到倍多毛的,該工具可能會注意到在模板參數的精確差異。

+2

這是'std'例外的不幸的副作用:以試圖避免內存分配他們的消息幾乎是無用的,因爲他們沒有堆棧跟蹤,所以幾乎不可能知道它們來自哪裏。另一方面,它們很輕便... –

回答

7

你也可以放棄dynamic_cast直接用途,並在自己的模板機器包裝它:

#include <sstream> 

class my_bad_cast: public std::bad_cast { 
public: 
    my_bad_cast(char const* s, char const* d): _source(s), _destination(d) { 
#ifdef WITH_BETTER_WHAT 
     try { 
      std::ostringstream oss; 
      oss << "Could not cast '" << _source 
       << "' into '" << _destination << "'"; 
      _what = oss.str(); 
     } catch (...) { 
      _what.clear(); 
     } 
#endif 
    } 

    char const* source() const { return _source; } 
    char const* destination() const { return _destination; } 

#ifdef WITH_BETTER_WHAT 
    virtual char const* what() const noexcept { 
     return not _what.empty() ? _what.c_str() : std::bad_cast::what(); 
    } 
#endif 

private: 
    char const* _source; 
    char const* _destination; 
#ifdef WITH_BETTER_WHAT 
    std::string _what; 
#endif 
    // you can even add a stack trace 
}; 

template <typename D, typename S> 
D my_dynamic_cast(S&& s) { 
    try { 
     return dynamic_cast<D>(std::forward<S>(s)); 
    } catch(std::bad_cast const&) { 
     throw my_bad_cast(typeid(S).name(), typeid(D).name()); 
    } 
} 
2

您可以在gbd中加載程序(用gcc和glang中的調試信息編譯,例如-g),告訴gdb用catch throw來捕獲異常,然後查看調用堆棧以查看引發異常的確切位置。

std::bad_castdynamic_cast在運行時失敗時引發。

+0

但是這並不能告訴我出了什麼問題......另一方面,我猜想指定的錯誤類型是唯一可能出錯的地方,對吧? – user7610

+1

@ user7610:是的,不幸的是,它可以來自任何使用'dynamic_cast'的地方,因此在大型程序中很難找到... –

+0

繼續從問題的例子我可以使用'std :: cout < user7610