4

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

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

4

2 回答 2

4

你不能特化类模板的某个部分特化的单个成员函数:如果你想走特化的路,你必须特化整个类。

但是,您可以决定采用重载方式,并通过标签调度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参数的值执行应执行的操作。

于 2013-05-15T21:36:49.180 回答
0

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

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

于 2013-05-15T21:39:44.087 回答