У меня есть оператор (в данном случае 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))
, чтобы посмотреть, будет ли он работать, но это не так.