【问题标题】:Partial specialization of template class copy constructor模板类拷贝构造函数的部分特化
【发布时间】:2013-05-15 21:28:20
【问题描述】:

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

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&lt;D, true&gt;&amp; other 无济于事。 VC++ 11 并没有突出显示部分专用的函数名称本身,所以我猜这个问题是一个不正确的名称。

【问题讨论】:

    标签: c++ templates compiler-errors


    【解决方案1】:

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

    但是,您可以决定采用重载方式,并通过标签调度区分destructtruefalse 的情况。

    例如,您可以定义两个名为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 参数的值执行应执行的操作。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多