Шаблоны c ++ в средах сборки Alpine

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

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
^

Мне кажется, расширение макросов здесь очень важно.
Любое объяснение приветствуется

0

Решение

Урезанный, ваш код похож на это:

#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 макрос внутри вашей функции.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector