Специализация шаблона только в области видимости - PullRequest
0 голосов
/ 01 октября 2019

У меня есть класс, настроенный по параметру N, в его собственном воспроизведении заголовочного файла. H:

#include <cstdlib>
#include <array>
template<std::size_t N>
class A{
  private:
  std::array<float, N> foo();
};

Я пытаюсь предоставить различные специализации для функции в зависимости от N.

В файле .C у меня есть:

#include "reproduction.H"
#include <tuple>

template <std::size_t N>
std::array<float,N> A<2>::foo(){return std::array<float, N>();}

template class A<2>;

И gcc 6 с c ++ 14 выдает мне ошибку

reproduction.C:5:21: error: prototype for 'std::array<float, N> A<2ul>::foo()' does not match any in class 'A<2ul>'
 std::array<float,N> A<2>::foo(){return std::array<float, N>();}
                     ^~~~
In file included from reproduction.C:1:0:
reproduction.H:6:24: error: candidate is: std::array<float, N> A<N>::foo() [with long unsigned int N = 2ul]
   std::array<float, N> foo();

Но, если я уроню N, и простоиметь

template <>
std::array<float,2> A<2>::foo(){return std::array<float, 2>();}

, который компилируется, и

template <std::size_t N>
std::array<float,N> A<N>::foo(){return std::array<float, N>();}

компилируется.

Почему первый случай потерпел неудачу, но следующие два прохода?

1 Ответ

1 голос
/ 01 октября 2019

Это

template <std::size_t N>
std::array<float,N> A<N>::foo(){return std::array<float, N>();}

является определением функции-члена первичного шаблона.

Это

template <>
std::array<float,2> A<2>::foo(){return std::array<float, 2>();}

является явной специализацией той же функции-члена.

Этот

template <std::size_t N>
std::array<float,N> A<2>::foo(){return std::array<float, N>();}

недопустим, поскольку список аргументов шаблона не соответствует списку параметров шаблона.

...