Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CTAD无法使用部分专门化中的SFINAE推断模板参数_C++_Templates_C++17_Ctad - Fatal编程技术网

C++ CTAD无法使用部分专门化中的SFINAE推断模板参数

C++ CTAD无法使用部分专门化中的SFINAE推断模板参数,c++,templates,c++17,ctad,C++,Templates,C++17,Ctad,我尝试在部分专业化中使用CTAD和SFINAE,但除非添加一个看似无用的演绎指南,否则它无法编译。背后的原因/限制是什么 模板 结构A; 模板 结构A { A(T){std::cout { A(T){std::cout A;//需要这个,否则无法编译 int main() { A A{1}; } 隐式生成的演绎指南仅镜像主模板的构造函数,而不是专门化的构造函数 如果您去掉其中一个专门化,并将代码从其中移到主模板中,那么它将起作用: template<typename T, typename

我尝试在部分专业化中使用CTAD和SFINAE,但除非添加一个看似无用的演绎指南,否则它无法编译。背后的原因/限制是什么

模板
结构A;
模板
结构A
{
A(T){std::cout
{
A(T){std::cout A;//需要这个,否则无法编译
int main()
{
A A{1};
}

隐式生成的演绎指南仅镜像主模板的构造函数,而不是专门化的构造函数

如果您去掉其中一个专门化,并将代码从其中移到主模板中,那么它将起作用:

template<typename T, typename Enable = void>
struct A
{
    A(T) { std::cout << "Other\n"; }
};

template<typename T>
struct A< T, std::enable_if_t<std::is_arithmetic_v<T>>>
{
    A(T) { std::cout << "Numerical\n"; }
};
模板
结构A
{
A(T){std::cout
{

A(T){std::cout Just
delete
ing
A(T)
在主函数中可能更好,特别是如果sfinae集更复杂。比如。这听起来不合理。因为我可以sfinae作为构造函数工作的“工厂函数”过载。