带模板的递归函数导致递归实例化(clang)

时间:2014-11-30 16:45:14

标签: c++ templates c++11 clang

我有以下代码,我不明白为什么这会用clang 3.5编译

   /** Greates common divisor */
   template<bool argsPositive = false,
            typename T
            >
    typename std::enable_if<std::is_integral<T>::value,T >::type
    gcd2( T  a, T  b )
    {

        if(!argsPositive){
            a = std::abs( a );
            b = std::abs( b );
        }

        if( a == 0  ||  a == b ){
            return  b;
        }
        if( b == 0 ){
            return  a;
        }
        if( a > b ){
            return  gcd2<true,T>( a % b, b );
        }
        else{
            return  gcd2<true,T>( a, b % a );
        }
    }

这个代码,其中enable_if在模板参数声明中,导致一个递归的实例化循环,编译器崩溃:

   /** Greates common divisor */
   template<bool argsPositive = false,
            typename T,
            typename std::enable_if<std::is_integral<T>::value>::type * = nullptr
            >
    T gcd2( T  a, T  b )
    {
     ....
    }

这是一个编译器错误,GCC编译正常:LINK

0 个答案:

没有答案