http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51973

             Bug #: 51973
           Summary: [regression][C++0x] Template parameter deduction fails
                    for overloaded functions when template parameters have
                    defaulted arguments
    Classification: Unclassified
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: gintensub...@gmail.com


Source Code (bug.cc):

#include <type_traits>
#include <utility>

struct Less
{
  template< class T, class U >
  auto operator()( T const& x, U const& y ) const
    -> decltype( x < y )
  {
    return x < y;
  }
};

template< class T, class Comp = Less,
  class = typename std::enable_if<
    std::is_constructible< bool,
      decltype(
        std::declval<Comp&>()(
          *std::declval<T const&>(),
          *std::declval<T const&>()
        )
      )
    >::value
  >::type
>
inline bool pointee_before( T const& x, T const& y, Comp && comp = Comp() ) {
  return y ? ( x ? bool( comp( *x, *y ) ) : true ) : false;
}

template< class T, class U, class Comp = Less,
  class = typename std::enable_if<
    std::is_constructible< bool,
      decltype(
        std::declval<Comp&>()(
          *std::declval<T const&>(),
          *std::declval<U const&>()
        )
      )
    >::value
  >::type
>
inline bool pointee_before( T const& x, U const& y, Comp && comp = Comp() ) {
  return y ? ( x ? bool( comp( *x, *y ) ) : true ) : false;
}

int main()
{
  int* p = 0;
  int const* q = 0;

  pointee_before( p, q );
}


Error Message:

bug.cc: In function 'int main()':
bug.cc:51:24: error: no matching function for call to 'pointee_before(int*&,
const int*&)'
bug.cc:51:24: note: candidates are:
bug.cc:26:13: note: template<class T, class Comp, class> bool
pointee_before(const T&, const T&, Comp&&)
bug.cc:26:13: note:   template argument deduction/substitution failed:
bug.cc:51:24: note:   deduced conflicting types for parameter 'const T' ('int*'
and 'const int*')
bug.cc:42:13: note: template<class T, class U, class Comp, class> bool
pointee_before(const T&, const U&, Comp&&)
bug.cc:42:13: note:   template argument deduction/substitution failed:
bug.cc:31:3: error: 'std::declval<const int*&>()' cannot be used as a function


GCC Version:

gcc-4.7-20120121 (experimental)

Reply via email to