模板类复制构造函数的部分特化

时间:2013-05-15 21:28:20

标签: c++ templates compiler-errors

我正在尝试部分专门化一个非常基本的模板化数组类的复制构造函数。

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没有突出显示部分专用的函数名称本身,所以我猜测问题的名称不正确。

2 个答案:

答案 0 :(得分:2)

你不能专门化一个类模板的某个部分特化的单个成员函数:如果你想要专门化的方式,你必须专门化整个类。

但是,您可以决定采用过载方式,并区分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参数的值执行应该执行的操作。

答案 1 :(得分:0)

编译器消息没有帮助(并且从G ++或Clang开始并没有更好),但它试图告诉您,如果尚未声明部分特化,则无法定义部分特化的成员函数。 / p>

即。你不能专门化类模板的单个成员函数,你必须声明整个类模板的特化。原因是构造函数不是模板,它是模板的普通(非模板)成员函数。要定义部分特化,您必须专门化整个类模板,不能专门化非模板。