【发布时间】:2020-11-10 20:56:30
【问题描述】:
问题描述
我正在尝试调用返回1 或2 的函数,具体取决于类型是signed char 还是unsigned int。
为此,我编写了以下代码。如果我在没有main 内的代码的情况下编译代码。我没有收到编译错误。
但是当我用对象Coverage 的实例化编译代码时,我得到以下编译错误:
main.cpp: In instantiation of ‘class Coverage<unsigned char>’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',27)">main.cpp:27:28</span>: required from here
main.cpp:12:9: error: no type named ‘type’ in ‘struct std::enable_if’
int getNb(typename std::enable_if<std::is_signed<T>::value, void>::type) {
^~~~~
main.cpp:17:9: error: invalid parameter type ‘std::enable_if::type {aka void}’
int getNb(typename std::enable_if<std::is_unsigned<T>::value, void>::type) {
^~~~~
main.cpp:17:9: error: in declaration ‘int Coverage::getNb(typename std::enable_if::value, void>::type)’
main.cpp: In function ‘int main()’:
main.cpp:28:18: error: ‘class Coverage’ has no member named ‘getNb’
std::cout << c.getNb() << std::endl;
我知道当我们添加typename std::enable_if 作为函数参数时,它没有被考虑在内。当我们有同名的成员函数时,它也是唯一使用的方法。
源代码
#include <iostream>
#include <type_traits>
template<typename T>
class Coverage
{
public:
Coverage(T type) :_type(type) {}
// signed char
int getNb(typename std::enable_if<std::is_signed<T>::value, void>::type) {
return 1;
}
// unsigned int
int getNb(typename std::enable_if<std::is_unsigned<T>::value, void>::type) {
return 2;
}
private:
T _type;
};
int main()
{
Coverage<unsigned char> c('c');
std::cout << c.getNb() << std::endl;
return 0;
}
【问题讨论】:
-
这不是 SFINAE 的工作方式。对于 SFINAE,您需要一个函数模板。
-
除了@Evg所说的,看看"immediate context"对SFINAEing的要求。
标签: c++ c++11 templates sfinae class-template