flo*_*tan 5 c++ templates language-lawyer variadic-templates
我试图在 CRTP 类中创建一个“转换复制构造函数”,如下所示: template struct Base;
template<typename Derived>
struct Base;
template<template<typename, typename...> class DerivedType, typename T, typename... Rest >
struct Base<DerivedType<T, Rest...>> {
Base() = default;
template<typename T2, typename... Rest2>
Base(const Base<DerivedType<T2, Rest2...>>& other) {
}
};
template<typename T>
struct Child : Base<Child<T>> {
using MyBase = Base<Child<T>>;
Child() = default;
template<typename T2>
Child(const Child<T2>& other) : MyBase(other) {}
};
int main() {
Child<int> cti;
Child<float> ctf = cti;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以使用 never gcc 版本进行编译,但不能使用其他编译器进行编译。他们拒绝它,因为模板参数太多:
<source>:11:21: error: too many template arguments for class template 'Child'
Base(const Base<DerivedType<T2, Rest2...>>& other) {
Run Code Online (Sandbox Code Playgroud)
显然, 的大小Rest2...是 0,所以我希望它匹配Child<T2>。
T2解决方法是从 Base 构造函数的定义中删除模板参数。但是,我很好奇这里是哪个编译器?
活生生的例子在这里。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |