2016-12-15 9 views
0

を返すときに、私は、このテンプレートメソッドでこのコンパイルエラーno matching function for call to ‘Color::Color(Component&)’を持っている「コールするための一致する関数がない」:コンパイルエラー:static_castを参照

template<typename U> 
inline U& getObject(const std::string& key) 
    { 
    return (static_cast<U>(*(_map.at(key)))); 
    } 

私は(部品そのようにそれを呼び出すには、私のマップを含む私のタイプであります):

components.getObject<Color>("Color").getColor();

色コンポーネント_MAPから継承した文字列のマップで、コンポーネント*(コンポーネントのポインタ)。

私はComponentから派生した型がたくさんあり、それらのマップをマップに格納しています。しかし、私は、マップからコンポーネントを取得し、それを使用する特定の型にキャストしようとすると、私は上記のコンパイルエラーが表示されます。なぜか分からない。

+1

静かにキャストしてU& –

+0

うんざりしました。うんざりしているとは信じられませんが、verryに感謝しています。睡眠が得られるはずです。 – Roger

+0

@Redleouf、それは誤植ですか?あなたがqを掲示したときの可能な答えうつ病? –

答えて

2

I have a lot of types derivating from Component and I store a pointer to them in my map. But when I try to get a Component from the map and cast it to a specific type to use it, I get the compile error above. I don't understand why.

機能が間違ってコーディングされているためです。

あなたの関数はオブジェクト(ない完全な派生型)のちょうどComponent部分にアクセスするためのポインタを参照解除、マップからComponent*ポインタを取得し、その後、派生クラスの一時的インスタンスを構築しようとしていますComponentを入力します。言い換えれば

、あなたの例では、基本的にこれをやっている:

inline Color& getObject(const std::string& key) 
{ 
    TComponent *pcomp = _map.at(key); 
    Color tmp(*pcomp); // <-- error here 
    return tmp; 
} 

エラーがColorクラスが入力としてComponentを受け取るコンストラクタを持っていないので、それはコンパイルに失敗したことを意味します。

参照を、関数の終了時に破棄される一時オブジェクトに返すので、コードがコンパイルされたとしても、間違っている可能性があります。そのため、呼び出し元は無効なメモリ。

@MikeVineコメントで述べたように、あなたはそれを修正するために、このような関数を書くことができます:

template<typename U> 
inline U& getObject(const std::string& key) 
{ 
    return static_cast<U&>(*(_map.at(key))); 
} 

そして、それが働くだろう、それは一時的なオブジェクトの構築を排除し、への参照を返すよう既存のオブジェクトはマップに格納されます。あなたはまた、代わりにこのような関数を書くことができ

template <typename U> 
inline U& getObject(const std::string& key) 
{ 
    return *(static_cast<U*>(_map.at(key))); 
} 

このコードは、派生クラスのオブジェクトにアクセスするには、それを逆参照する前に、まずU*ポインタにComponent*ポインタをキャストします。

あなたは要求されたコンポーネントが実際に要求されたタイプであるかどうかを実行時にわからない場合、あなたはそれを返す前に確認するために、ハンドリングいくつかの余分なエラーを追加することができます。また

template <typename U> 
inline U& getObject(const std::string& key) 
{ 
    U *ptr = dynamic_cast<U*>(_map.at(key)); 
    if (!ptr) throw std::invalid_argument(""); 
    return *ptr; 
} 

template<typename U> 
inline U& getObject(const std::string& key) 
{ 
    return dynamic_cast<U&>(*(_map.at(key))); 
} 
関連する問題