我正在编写一个递归函数,其结束条件由模板参数确定。我正在使用boost::enable_if
andboost::disable_if
为空的基本情况切换递归函数(以防止烦人的无限实例化循环)。
问题是它似乎取决于我定义这些函数的顺序:
#include <boost/utility.hpp>
template <unsigned a, unsigned b>
typename boost::disable_if_c<a == b>::type f()
{
f<a+1,b>();
}
template <unsigned a, unsigned b>
typename boost::enable_if_c<a == b>::type f()
{
}
int main()
{
f<0,5>();
}
编译器 (g++4.6) 失败并出现错误:
test.cpp:7:5: error: no matching function for call to ‘f()’
test.cpp:7:5: note: candidate is:
test.cpp:5:44: note: template<unsigned int a, unsigned int b> typename boost::disable_if_c<(a == b)>::type f()
由于某种原因,只有禁用的功能作为候选,启用的功能没有看到。
如果我切换定义这两个函数的顺序,它将编译时出现问题且没有警告:
#include <boost/utility.hpp>
template <unsigned a, unsigned b>
typename boost::enable_if_c<a == b>::type f()
{
}
template <unsigned a, unsigned b>
typename boost::disable_if_c<a == b>::type f()
{
f<a+1,b>();
}
int main()
{
f<0,5>();
}
为什么是这样?当实例化发生时(in main
),编译器已经看到了这两个函数,不应该关心谁先排队。至少我是这么想的。