2011-10-24 23 views
0

そのテンプレート;-)次のテンプレートメンバ関数とCRTPクラスを考える:マッチ固定サイズの配列

template<typename T> 
struct base 
{ 
    ... 
}; 

struct derived : public base<derived> 
{ 
    ... 
}; 

struct some_class 
{ 
    template<typename T> 
    void match(base<T>* array, size_t count) 
    { 
     ... 
    }; 

    template<typename T, size_t count> 
    void match(base<T> (&array)[count]) 
    { 
     ... 
    }; 
}; 

なぜコンパイラは、第二の機能の一致を見つけることができません。

derived array[10]; 
some_class foo; 

foo.match(array, 10); // works fine 
foo.match(array);  // Error: no matching function for call to some_class::match(derived array[10]) 

私は、2番目のテンプレート関数がコンパイル時のfixde配列サイズを差し引くことができると思いますが、明らかに関数は考慮されていません。どうして?

おかげ

編集:妙に以下のバージョンは罰金コンパイル:

template<typename T, size_t count> 
    void match(T (&array)[count]) 
    { 
     ... 
    }; 

だから私はいくつかの点で元のバージョンは、私はちょうど表示されていない何らかの理由で除外されることを疑います。

答えて

1

Derived の配列は、の配列をBaseの配列に変換できません。最初のコンストラクタの最初の要素にアクセスする以外は、配列で何かをしたことがある場合は、未定義の動作になります。

コードをコンパイルしないため、リファレンスを正しく使用すると、このような状況から正しく保護されます。しかし、は、配列を単一のポインタに崩壊させてコンパイルすると、Baseへのポインタに壊れる可能性があり、Base<T>*の実行可能なオーバーロードが残っています。

関連する問題