首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SFINAE结构

SFINAE结构
EN

Stack Overflow用户
提问于 2018-07-11 19:04:28
回答 2查看 705关注 0票数 5

我一直喜欢SFINAE的语法像这样的功能,似乎一般工作得很好!

代码语言:javascript
复制
template <class Integer, class = typename std::enable_if<std::is_integral<Integer>::value>::type>
T(Integer n) {
    // ...
}

但当我也想在同一堂课上做这件事时,我遇到了一个问题.

代码语言:javascript
复制
template <class Float, class = typename std::enable_if<std::is_floating_point<Float>::value>::type>
T(Float n) {
    // ...
}

获取这样的错误:

代码语言:javascript
复制
./../T.h:286:2: error: constructor cannot be redeclared
        T(Float n) {
        ^
./../T.h:281:2: note: previous definition is here
        T(Integer n) {
        ^
1 error generated.

这些构造函数不应该只存在于适当的类型而不是同时存在吗?他们为什么会发生冲突?

我在这里是不是有点笨?

另一方面,这确实有效(但我不太喜欢语法):

代码语言:javascript
复制
template <class Integer>
T(Integer n, typename std::enable_if<std::is_integral<Integer>::value>::type* = nullptr) {
}

template <class Float>
T(Float n, typename std::enable_if<std::is_floating_point<Float>::value>::type* = nullptr) {
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-11 19:14:38

改用非类型模板参数:

代码语言:javascript
复制
template <class Integer,
    std::enable_if_t<std::is_integral<Integer>::value, int> = 0>
T(Integer n) {
    // ...
}

template <class Float,
    std::enable_if_t<std::is_floating_point<Float>::value, int> = 0>
T(Float n) {
    // ...
}

这是因为编译器必须替换第一个模板参数,然后才能确定值参数的类型。

票数 11
EN

Stack Overflow用户

发布于 2018-07-11 19:15:35

解决这一问题的一种方法是添加额外的, typename=void参数,这样所有重载都不会有相同数量的模板参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51292574

复制
相关文章

相似问题

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