Search code examples
c++templatesc++14enable-if

Template class definition with enable_if causes error


Can someone please help me to understand why the following code does not compile and also help me to fix it:

template< size_t N_1, size_t N_2, typename callable, typename T_out = typename std::result_of<callable>::type, size_t N = N_1 - N_2, std::enable_if_t< N_1>=N_2>* = nullptr>
class A
{
  template<std::size_t... I>
  void foo();
};


template< size_t N_1, size_t N_2, typename callable >
template<std::size_t... I>
void A< N_1, N_2, callable>::foo()
{
}

Error:

error: nested name specifier 'A<N_1, N_2, callable>::' for declaration does not refer into a class, class template or class template partial specialization
    void A< N_1, N_2, callable>::foo()
         ~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.

Many thanks in advance.


Solution

  • A definition of a template declaration needs to match the declaration. The std::enable_if_t does throw a curveball here, but this seems to work with gcc 6.2:

    template< size_t N_1, size_t N_2, typename callable, typename T_out, size_t N,
          std::enable_if_t< N_1 >= N_2> *p>
    template<std::size_t... I>
    void A< N_1, N_2, callable, T_out, N, p>::foo()
    {
    }