模棱两可的函数模板

ambiguous function template

我想 select 通过 enable_if 将特定函数模板应用于 return 类型。

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

#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 参数,我希望它能正常工作。

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

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

您可以使用 enable_if_t 或添加 ::type 之类的

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

正如 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;
}