gpt4 book ai didi

c++ - 引入std::enable_if后"No match"错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:28 26 4
gpt4 key购买 nike

我有一个运算符(operator)(在本例中为 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 block ,然后它按预期编译和运行,但是一旦我把它放在那里它就会产生格式错误

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::typevoid .没有 class void被视为非类型模板参数有什么问题( void 不能用作非类型参数 reference )。

通过使用 class/typename第二个参数定义为采用 void - class SomeTypeName = void 的类型参数如果 enable_if 中的条件为真,或者此函数模板从 enable_if 的条件为假时设置的重载中丢弃。

关于c++ - 引入std::enable_if后"No match"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55332760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com