У меня есть класс, настроенный по параметру 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>();}
компилируется.
Почему первый случай потерпел неудачу, но следующие два прохода?