1)
template<typename T, class Allocator>
typename SList<T,Allocator>::iterator SList<T,Allocator>::begin()
^^^^^^^^
Это раздражает, но привыкни.Компилятор предполагает, что все подобные шаблонные вещи являются переменными, поэтому, если это тип, вы должны сказать это конкретно.
2) Компилятор должен знать, что определение функции предназначено для класса SList
, который имеет два параметра шаблона, и что оба могут быть чем угодно, это не специализация.Я понимаю, что ваш по умолчанию и не будет двусмысленным, если бы по умолчанию не было, но я думаю, что это в первую очередь упрощает компиляторы.
3) Определения могут быть в отдельном файле, ноне в своем собственном «модуле перевода» (скомпилированный файл .cpp и он включает в себя).Так что не помещайте это в .cpp, это просто сбивает с толку.Нередко определения шаблонов находятся в файле .incl, который находится внизу заголовка.Это делает компилятор счастливым, и у вас все еще есть разделение объявления и определения.