模棱两可的函数模板
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;
}
我想 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;
}