簡體   English   中英

匹配CRTP類的固定大小的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM