模板化类的模板化构造函数的显式模板专用化

Explicit template specialization for templated constructor of templated class

本文关键字:专用 构造函数      更新时间:2023-10-16

这个问题可能与这个问题重叠:C++模板化类的模板化构造函数的显式模板专用化。但是,我在该线程中没有找到解决方案。

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

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 编译它时,我得到 错误:">"令牌之前的显式专用化无效 错误:封闭类模板不是显式专用的 对早期的错误感到困惑,纾困

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

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

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

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&、常量 X&、易失性 X& 或常量易失性 X&,要么没有其他参数,要么所有其他参数 参数具有默认参数 (8.3.6)。

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

典型的解决方法是函数/方法重载,如Dieter Lücking在他的答案中所显示的那样。

这里也回答了