auto stdMaxInt = std::max<int> 的类型推导失败;
type deduction failing for auto stdMaxInt = std::max<int>;
使用带有 g++ --std=c++11 main.cpp
的 GCC 4.8.4 输出以下 error
error: unable to deduce ‘auto’ from ‘max<int>’
auto stdMaxInt = std::max<int>;
对于此代码
#include <algorithm>
template<class T>
const T& myMax(const T& a, const T& b)
{
return (a < b) ? b : a;
}
int main()
{
auto myMaxInt = myMax<int>;
myMaxInt(1, 2);
auto stdMaxInt = std::max<int>;
stdMaxInt(1, 2);
}
为什么它适用于 myMax
但不适用于 std::max
?我们可以让它与 std::max
一起使用吗?
因为std::max
是一个重载函数,所以它不知道你要创建指向哪个重载的指针。您可以使用 static_cast
到 select 您想要的重载。
auto stdMaxInt = static_cast<const int&(*)(const int&, const int&)>(std::max<int>);
@JamesRoot 的 static_cast
答案有效,但根据我的口味,我更喜欢 lambda:
auto stdMaxInt = [](int const& L, int const& R) -> int const& { return std::max(L, R); };
当传递给算法(未经测试)时,这可能具有更好的内联能力的优势。
使用带有 g++ --std=c++11 main.cpp
的 GCC 4.8.4 输出以下 error
error: unable to deduce ‘auto’ from ‘max<int>’
auto stdMaxInt = std::max<int>;
对于此代码
#include <algorithm>
template<class T>
const T& myMax(const T& a, const T& b)
{
return (a < b) ? b : a;
}
int main()
{
auto myMaxInt = myMax<int>;
myMaxInt(1, 2);
auto stdMaxInt = std::max<int>;
stdMaxInt(1, 2);
}
为什么它适用于 myMax
但不适用于 std::max
?我们可以让它与 std::max
一起使用吗?
因为std::max
是一个重载函数,所以它不知道你要创建指向哪个重载的指针。您可以使用 static_cast
到 select 您想要的重载。
auto stdMaxInt = static_cast<const int&(*)(const int&, const int&)>(std::max<int>);
@JamesRoot 的 static_cast
答案有效,但根据我的口味,我更喜欢 lambda:
auto stdMaxInt = [](int const& L, int const& R) -> int const& { return std::max(L, R); };
当传递给算法(未经测试)时,这可能具有更好的内联能力的优势。