"No match" 引入后出错 std::enable_if
"No match" error after introducing std::enable_if
我有一个运算符(在本例中为 operator&=
,但这不是问题)工作正常,直到我将 std::enable_if_t
引入组合。
用代码示例说明更简单:
template<typename T, std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>>
MyClass& MyClass::operator&=(T d)
{ /*... */ }
// then in main
MyClass a;
a &= static_cast<unsigned char>42;
a &= (unsigned long long)47;
如果我注释掉 std::enable_if_t
块,那么它会按预期编译和运行,但是一旦我把它放在那里,它就会产生格式错误
test.cpp:42:7: error: no match for ‘operator&=’ (operand types are ‘MyClass’ and ‘unsigned char’)
a &= static_cast<unsigned char>(42);
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.cpp:4:0:
file.hpp:69:103: note: candidate: template<class T, typename std::enable_if<(is_integral_v<T> && is_unsigned_v<T>), void>::type <anonymous> > MyClass& MyClass::operator&=(T)
template<typename T, std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>> MyClass& operator&=(T d);
^~~~~~~~
file.hpp:69:103: note: template argument deduction/substitution failed:
test.cpp:42:39: note: couldn't deduce template parameter ‘<anonymous>’
a &= static_cast<unsigned char>(42);
我觉得我在这里缺少一些简单的东西。我什至已经尝试通过调用 a.operator&=<unsigned char>(static_cast<unsigned char>(42))
来提示编译器,看看它是否会工作,但它没有。
您需要在
定义的第二个模板参数中使用 class
/typename
template<typename T, class = std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>>
^^^^^
MyClass& MyClass::operator&=(T d)
当条件std::is_integral_v<T> && std::is_unsigned_v<T>
为真时,enable_if::type
为void
。没有 class
void
被视为非类型模板参数,这是错误的(void
不能用作非类型参数 reference)。
通过使用 class
/typename
第二个参数被定义为带 void 的类型参数 - class SomeTypeName = void
如果 enable_if 中的条件为真,或者此函数当 enable_if 的条件为 false 时,模板从重载设置中被丢弃。
我有一个运算符(在本例中为 operator&=
,但这不是问题)工作正常,直到我将 std::enable_if_t
引入组合。
用代码示例说明更简单:
template<typename T, std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>>
MyClass& MyClass::operator&=(T d)
{ /*... */ }
// then in main
MyClass a;
a &= static_cast<unsigned char>42;
a &= (unsigned long long)47;
如果我注释掉 std::enable_if_t
块,那么它会按预期编译和运行,但是一旦我把它放在那里,它就会产生格式错误
test.cpp:42:7: error: no match for ‘operator&=’ (operand types are ‘MyClass’ and ‘unsigned char’)
a &= static_cast<unsigned char>(42);
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.cpp:4:0:
file.hpp:69:103: note: candidate: template<class T, typename std::enable_if<(is_integral_v<T> && is_unsigned_v<T>), void>::type <anonymous> > MyClass& MyClass::operator&=(T)
template<typename T, std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>> MyClass& operator&=(T d);
^~~~~~~~
file.hpp:69:103: note: template argument deduction/substitution failed:
test.cpp:42:39: note: couldn't deduce template parameter ‘<anonymous>’
a &= static_cast<unsigned char>(42);
我觉得我在这里缺少一些简单的东西。我什至已经尝试通过调用 a.operator&=<unsigned char>(static_cast<unsigned char>(42))
来提示编译器,看看它是否会工作,但它没有。
您需要在
定义的第二个模板参数中使用class
/typename
template<typename T, class = std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>>>
^^^^^
MyClass& MyClass::operator&=(T d)
当条件std::is_integral_v<T> && std::is_unsigned_v<T>
为真时,enable_if::type
为void
。没有 class
void
被视为非类型模板参数,这是错误的(void
不能用作非类型参数 reference)。
通过使用 class
/typename
第二个参数被定义为带 void 的类型参数 - class SomeTypeName = void
如果 enable_if 中的条件为真,或者此函数当 enable_if 的条件为 false 时,模板从重载设置中被丢弃。