[英]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沒有突出顯示部分專用的函數名稱本身,所以我猜測問題是某個錯誤的名稱。
您不能專門化類模板的某個部分特化的單個成員函數:如果您想要使用特化方法,則必須專門化整個類。
但是,您可以決定采用過載方式,並在destruct
為true
時通過標簽分派將其區分為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.