问题描述
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仅来自主要模板。
如果您不想在主模板中添加该构造函数,则仍然可以提供自定义推导指南。