我正在尝试在CRTP类中创建“转换副本构造函数”,如下所示: 模板 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;
}
该代码永远不会使用gcc版本进行编译,而不会使用其他编译器进行编译。他们由于模板参数过多而拒绝了它:
<source>:11:21: error: too many template arguments for class template 'Child'
Base(const Base<DerivedType<T2, Rest2...>>& other) {
很显然,Rest2...
的大小为0,所以我希望它与Child<T2>
匹配。
解决方法是从Base构造函数的定义中删除模板参数T2
。但是,我很好奇哪个编译器在这里?
实时示例here。