【问题标题】:Explicit template specialization for templated constructor of templated class模板类的模板构造函数的显式模板特化
【发布时间】:2014-02-25 14:20:08
【问题描述】:

这个问题可能与这个问题重叠:C++ explicit template specialization of templated constructor of templated class。 但是,我没有在那个帖子中找到解决方案。

我有一个带有模板构造函数的模板类:

template<typename First, typename ... Rest> class var {
    public:
        template<typename T> var(T& t) {
            std::cout << "general" << std::endl;
        }
};

但是,如果这个类是用与参数相同的类的对象实例化的(即,我们想调用复制(或移动)构造函数),则应该做一些特定的事情。所以我尝试了以下方法:

template<typename First, typename ... Rest> template<> 
var<First, Rest...>::var(var<First, Rest...>& v) {
    std::cout << "copy" << std::endl;
}

当试图用 g++ 4.6 编译它时,我得到 错误:“>”标记之前的显式特化无效 错误:封闭类模板没有明确专门化 被之前的错误弄糊涂了,想要摆脱困境

我看到了问题,我必须明确说明我想为哪个类专门化构造函数...

但是,我希望我想做什么变得很清楚。有什么想法吗?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    模板构造函数不是复制构造函数:

    template<typename First, typename ... Rest> class var {
        public:
        var() {};
        var(const var& v) {
            std::cout << "copy" << std::endl;
        }
        template<typename T>
        var(const T& t) {
            std::cout << "general" << std::endl;
        }
    };
    
    int main()
    {
        var<int> i0;
        var<int> i1(i0);
        var<int> i2("Hello");
    }
    

    给予

    copy
    general
    

    注意:添加了一些常量

    您尝试将非复制构造函数特化为复制构造函数失败。

    12.8:

    类 X 的非模板构造函数是一个复制构造函数,如果它 第一个参数的类型为 X&、const X&、volatile X& 或 const volatile X&,或者没有其他参数,或者所有其他 参数具有默认参数 (8.3.6)。

    【讨论】:

    【解决方案2】:

    如果不完全专门化类,就无法专门化模板化方法。这是 C++ 标准所禁止的。

    Dieter Lücking 在他的回答中表明,典型的解决方法是函数/方法重载。

    Also answered here

    【讨论】:

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