模板化类的模板化构造函数的显式模板专用化
Explicit template specialization for templated constructor of templated class
这个问题可能与这个问题重叠: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在他的答案中所显示的那样。
这里也回答了
相关文章:
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数 (g++) 的显式模板专用化
- 构造函数的部分模板专用化
- 如何在另一个类模板中定义完全专用类的构造函数
- 模板专用类之间的构造函数重载
- 使用模板的构造函数专用化
- 如何将模板构造函数专用化移动到 cpp 文件
- 模板类模板构造函数专用化
- 定义专用模板类构造函数时避免重复
- 模板化类的模板化构造函数的显式模板专用化
- 具有 n 个参数的模板专用构造函数
- 不会调用模板化构造函数的专用模板
- 没有模板参数的类的C++专用构造函数(跳过尖括号)
- 专用于非模板类的模板化构造函数
- 专用于模板类构造函数
- C++单个构造函数模板专用化
- 模板专用化没有匹配的构造函数
- 在模板专用化中添加单个构造函数方法
- 从派生类实现基类构造函数专用化的替代方法是什么
- 类定义中构造函数的模板专用化