【发布时间】:2019-03-25 07:11:30
【问题描述】:
我有一个工作正常的运算符(在本例中为 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)) 来提示编译器以查看它是否可以工作,但它没有。
【问题讨论】:
-
template<void> void someFunc(){}语法无效。第二个模板参数中缺少typename或class:template<typename T, class = std::enable_if_t<>... -
@rafix07,谢谢,我在
std::enable_if_t之前添加了typename =,它立即生效。如果你把它写成答案,我会接受