Я в недоумении, почему такая нетипичная конструкция аргумента шаблона
template <typename TValue, typename TFile, size_t PAGESIZE>
inline typename Size<Buffer<TValue, PageFrame<TFile, Fixed<PAGESIZE> > > >::Type
capacity(Buffer<TValue, PageFrame<TFile, Fixed<PAGESIZE> > > const &)
{
return PAGESIZE;
}
отключит clang (4.0.0) и g ++ (6.3.0) с помощью пакетов Alpine buildbase / gcc / stdlibc ++ / cmake.
Это происходит в Alpine:
file_page.h:76:22: error: expected ',' or '>' in template-parameter-list
template <size_t PAGESIZE>
^
/usr/include/limits.h:44:18: note: expanded from macro 'PAGESIZE'
#define PAGESIZE PAGE_SIZE
^
/usr/include/bits/limits.h:3:19: note: expanded from macro 'PAGE_SIZE'
#define PAGE_SIZE 4096
^
Мне кажется, расширение макросов здесь очень важно.
Любое объяснение приветствуется
Урезанный, ваш код похож на это:
#include <cstddef>
#define PAGE_SIZE 4096
#define PAGESIZE PAGE_SIZE
template<std::size_t PAGESIZE>
void f() {}
Вы называете свой нетипичный параметр шаблона тем же именем, что и макрос, который расширяется до определенного значения. Это как если бы вы написали:
#include <cstddef>
template<std::size_t 4096>
void f() {}
Это явно неверный синтаксис.
Если вы хотите установить значение по умолчанию для нетипичного параметра шаблона равным значению вашего макроса, вы можете написать его так:
#include <cstddef>
#define PAGE_SIZE 4096
#define PAGESIZE PAGE_SIZE
template<std::size_t page_size = PAGESIZE>
void f() {}
Тем не менее, обязательно используйте page_size
вместо PAGESIZE
макрос внутри вашей функции.
Других решений пока нет …