簡體   English   中英

模板類復制構造函數的部分特化

[英]Partial specialization of template class copy constructor

我試圖部分專門化一個非常基本的模板化數組類的復制構造函數。

template<typename D, bool destruct = false> class SimpleArray
{
 SimpleArray(const SimpleArray& other)
 {
  //stuff
 }

 //various other things
}

template<typename D> SimpleArray<D, true>::SimpleArray(const SimpleArray& other)
{
 //different stuff
}

但我得到這個錯誤:

'SimpleArray<D,destruct>::{ctor}' : unable to match function definition to an existing declaration

但是,我肯定已經聲明了這個函數......我嘗試將部分特化中的參數更改為const SimpleArray<D, true>& other無濟於事。 VC ++ 11沒有突出顯示部分專用的函數名稱本身,所以我猜測問題是某個錯誤的名稱。

您不能專門化類模板的某個部分特化的單個成員函數:如果您想要使用特化方法,則必須專門化整個類。

但是,您可以決定采用過載方式,並在destructtrue時通過標簽分派將其區分為false

例如,您可以定義兩個名為copy_construct私有成員函數,如下所示:

template<typename D, bool destruct = false>
class SimpleArray
{

    // ...

private:

    void copy_construct(const SimpleArray& other, std::true_type)
    {
        // ...
    }

    void copy_construct(const SimpleArray& other, std::false_type)
    {
        // ...
    }
};

然后你可以讓你的類的復制構造函數根據destruct參數的值調用適當的重載:

template<typename D, bool destruct = false>
class SimpleArray
{

public:

    // ...

    SimpleArray(const SimpleArray& other)
    {
        copy_construct(other, std::integral_constant<bool, destruct>());
    }

    // ...

};

這將調用相應版本的copy_construct() ,它將根據destruct參數的值執行應該執行的操作。

編譯器消息沒有幫助(並且從G ++或Clang開始並不是更好),但它試圖告訴您,如果尚未聲明部分特化,則無法定義部分特化的成員函數。

即,您不能專門化類模板的單個成員函數,您必須聲明整個類模板的特化。 原因是構造函數不是模板,它是模板的普通(非模板)成員函數。 要定義部分特化,您必須專門化整個類模板,不能專門化非模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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