2011-10-24 40 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]) 

我期望第二個模板函數可以扣除編譯時fixde數組的大小,但顯然這個函數沒有考慮到。爲什麼?

感謝

編輯:奇怪的是以下版本編譯罰款:

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

所以我懷疑,在一些點上的原始版本被排除由於某種原因,我只是不明白。

回答

1

Derived 不能將轉換爲Base數組。如果除了訪問第一個構造函數中的第一個元素之外,您曾經對該數組做過任何操作,那麼它將是Undefined Behavior。

正確引用引用可以保護您免受這種情況的影響,因爲代碼無法編譯。然而,通過將數組衰減到單個指針進行編譯,該指針可衰減爲指向Base的指針,這會使Base<T>*超載可行,但仍然不好。