[英]Match fixed-size array of CRTP class
再次提供其模板;-)給定以下模板成員函數和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])
{
...
};
因此,我懷疑出於某些原因(我只是看不到)而將原始版本排除在外。
派生數組不能轉換為基數組。 如果您除了訪問第一個構造函數中的第一個元素之外,還對數組做過任何事情,那么它將是未定義行為。
正確地使用引用可以保護您免受這種情況的影響,因為代碼無法編譯。 然而, 將通過陣列衰減到單個指針,其可以衰減到指針至基礎,這使得編譯Base<T>*
過載上可行,但還是壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.