首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTAD无法在部分专门化中使用SFINAE推导模板参数

CTAD无法在部分专门化中使用SFINAE推导模板参数
EN

Stack Overflow用户
提问于 2020-10-03 21:20:58
回答 1查看 80关注 0票数 2

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

代码语言:javascript
复制
template<typename T, typename Enable = void>
struct A;

template<typename T>
struct A< T, std::enable_if_t<std::is_arithmetic_v<T>>>
{
    A(T) { std::cout << "Numerical"; }
};

template<typename T>
struct A<T, std::enable_if_t<!std::is_arithmetic_v<T>>>
{
    A(T) { std::cout << "Other"; }
};

template<typename T>
A(T)->A<T>; //Need to have this, otherwise doesn't compile

int main()
{
    A a{ 1 };
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-03 21:28:50

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

如果您去掉其中一个特殊化,并将代码从其中移动到主模板中,它将会起作用:

代码语言:javascript
复制
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"; }
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64184732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档