引入 std::enable_if 后出现"No match"错误
"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))
来提示编译器以查看它是否可以工作,但它没有。
typename
class
您需要在定义
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
不能用作非类型参数引用(。
通过使用 class
/typename
,第二个参数被定义为类型参数,如果 enable_if 中的条件为真,则取 void - class SomeTypeName = void
,或者当enable_if的条件为 false 时,此函数模板从重载中丢弃。
相关文章:
- 错误消息:使用"string* +="后"no match for 'operator+='"
- 在 Eclipse: "error: no match for 'operator='" 中获取错误消息
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 为什么我收到以下错误:"no match for 'operator=='"?(带模板的嵌套类)
- 在命名空间内的类中使用带有运算符重载的字符串流时"no match for ‘operator>>’"
- 提升::访客操作员过载的变体"Error: no match for call to [...]"
- 如何修复C++中的"no match for operator+"?
- 运算符重载错误"no match for operator error"
- 引入 std::enable_if 后出现"No match"错误
- "No match for operator []"
- 如果我没有重载,为什么我会"no match for ‘operator=’"自定义类?
- 为什么编译器显示错误"no match for 'operator[]' (operand types are 'carti' and 'int')"
- 对简单的帐户检查程序有问题?程序返回编译错误,指出"no match for 'operator||' unsure of how to fix?"
- "no match for 'operator >>'"代码中是什么意思?
- 如何将对象分配到2D矢量no Match oterator =
- "no match for ‘operator>>’ in ‘inputFile >> buffer"错误?
- 如何修复" no match for 'operator<<' in 'std::cout"错误?
- 简单迭代器差异的"No match for operator-"错误