【问题标题】:ambiguous function template模棱两可的函数模板
【发布时间】:2018-08-07 08:22:57
【问题描述】:

我想通过 enable_if 选择一个特定的函数模板应用于返回类型。

一个简单的例子是区分有符号和无符号参数。

#include <iostream>
#include <type_traits>

template<typename T>
typename std::enable_if<std::is_signed_v<T>, bool>
foo(T t)
{
  return true;
}

template<typename T>
typename std::enable_if<!std::is_signed_v<T>, bool>
foo(T t)
{
  return false;
}

int main(){
  std::cout << foo<uint32_t>(42) << std::endl;

  return 0;
}

这里我得到编译器错误:call of overloaded ‘foo<uint32_t>(int)’ is ambiguous std::cout << foo<uint32_t>(42) << std::endl;

我知道如果我使用 foo(42) 会很模糊,因为 42 可以转换为有符号的无符号。但是,如果我像示例中那样明确指定 tempalte 参数,我希望它可以工作。

我的代码有什么问题,我该如何解决?

【问题讨论】:

    标签: c++ templates enable-if


    【解决方案1】:

    您在enable_if 末尾缺少::type,因此即使条件为假也不会发生错误

    您可以使用enable_if_t 或添加::type 喜欢

    typename std::enable_if<std::is_signed_v<T>, bool>::type
    

    【讨论】:

      【解决方案2】:

      正如 Tyker 已经回答的那样,您缺少来自 enable_if::type

      顺便说一句,您可以使用std::enable_if_t (since C++14) 减少样板文件的数量

      template<typename T>
      std::enable_if_t<std::is_signed_v<T>, bool>
      foo(T t)
      {
        return true;
      }
      
      template<typename T>
      std::enable_if_t<!std::is_signed_v<T>, bool>
      foo(T t)
      {
        return false;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-26
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 2018-05-10
        • 2015-01-12
        相关资源
        最近更新 更多