考虑this代码:
#include <type_traits>
template < typename > struct BB { };
template < > struct BB<float> : BB<int> { };
struct DD : BB<float> { };
template < typename... Args >
void ff(BB<Args...>) { }
int main()
{
ff(BB<float>{});
ff(DD{}); // FAILS! 'BB<Args ...>' is an ambiguous base class of 'DD'
return 0;
}
ff(DD{})
的调用无法编译,因为gcc-8.3
不想从BB<float>
和BB<int>
中选择一个(clang
进行相同的操作)。但是BB<float>
是BB<int>
,那么为什么不能只选择BB<float>
?问题是:这是否符合标准?在定义
ff
或BB
时是否有变通办法,以帮助gcc-8.3
选择BB<float>
? 最佳答案
这个问题是CWG 2303的主题。委员会决定增加措辞“优先选择'较近的'基础类”,措辞为added to the working draft。因此,在C++ 20中,您的示例应实例化ff<float>(BB<float>)
,而在C++ 17中,它是模棱两可的。
当然,如果您的编译器不支持“C++ 2a”模式或C++ 2a模式尚未实现此更改,则解决方法是添加ff
重载,并重载D
。
关于c++ - 继承特化的模板参数推导,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57529401/