c – SFINAE启用非模板成员函数

这可能是一个重复,但我找不到一个OP明显有我遇到的问题.
我有一个类,如果类模板参数不是无符号类型,我试图仅启用运算符.
#include <type_traits>

template<class T>
struct A {
    typename std::enable_if<!std::is_unsigned<T>::value,A>::type operator-() {return {};}
};

int main() {
    A<unsigned> a=a;
}

不幸的是,只要我用无符号类型实例化它就会产生编译错误,如图所示.

main.cpp:5:29: error: no type named 'type' in 'std::enable_if<false,A<unsigned int> >'; 'enable_if' cannot be used to disable this declaration
    typename std::enable_if<!std::is_unsigned<T>::value,A>::type operator-() {return {};}
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:9:17: note: in instantiation of template class 'A<unsigned int>' requested here
    A<unsigned> a=a;
                ^

好吧,我可以清楚地看到enable_if在这里不起作用.一个模糊的类似问题提到我可以使用继承和模板专门化来解决这个问题,但是……真的没有更好的方法吗?

解决方法

我曾经遇到过同样的问题.事实证明,由于认模板参数不依赖于函数模板中的模板参数,因此无法进行替换失败.您必须将模板参数认为封闭模板类型,如下所示:
template<typename U = T,class = typename std::enable_if<!std::is_unsigned<U>::value,U>::type>
A operator-() { return {}; }

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...