【问题标题】:"No match" error after introducing std::enable_if引入 std::enable_if 后出现“不匹配”错误
【发布时间】: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&amp;=&lt;unsigned char&gt;(static_cast&lt;unsigned char&gt;(42)) 来提示编译器以查看它是否可以工作,但它没有。

【问题讨论】:

  • template&lt;void&gt; void someFunc(){} 语法无效。第二个模板参数中缺少typenameclasstemplate&lt;typename T, class = std::enable_if_t&lt;&gt;...
  • @rafix07,谢谢,我在std::enable_if_t 之前添加了typename = ,它立即生效。如果你把它写成答案,我会接受

标签: c++ c++17 enable-if


【解决方案1】:

你需要在定义的第二个模板参数处使用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&lt;T&gt; &amp;&amp; std::is_unsigned_v&lt;T&gt; 为真时,enable_if::typevoid。没有class void 被视为非类型模板参数有什么问题(void 不能用作非类型参数reference)。

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

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 2011-03-13
    • 2017-07-18
    • 2021-05-11
    • 2016-01-23
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多