为什么C ++ 17类模板参数推导失败?

问题描述

C ++ 17提供了class template argument deduction

我有一个下面的小示例(您可以将其粘贴到启用了C ++ 17的onlinegdb中,没问题),在某些情况下它会失败,但是我不知道为什么:

#include <iostream>
enum class Res{
    ResA,ResB
};

template<Res>
class B{   
};

template<Res T>
class A{
    //If I remove this construtor,template type deduction will not work anymore
    public:   
    A(B<T> b){       
    }
};

template<>
class A<Res::ResA>{
    public:
    A(B<Res::ResA> b){
        std::cout<<"A res A\n";
    }  
};

int main()
{
    B<Res::ResA> b;
    A a(b);
}

上面的代码有效。但是,一旦我将A的构造函数更改为模板专业化版本以外的任何其他构造函数,模板参数推导将不起作用,A必须由A<Res::ResA>初始化。

我很茫然。为什么会这样呢?谢谢您的任何想法!

解决方法

生成的CTAD仅来自主要模板。

如果您不想在主模板中添加该构造函数,则仍然可以提供自定义推导指南。