高山构建环境中的 C++ 模板

c++ templates in alpine build environments

我很困惑为什么要构造这样一个非类型模板参数

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;
}

会用 Alpines buildbase/gcc/stdlibc++/cmake 包绊倒 clang(4.0.0) 和 g++(6.3.0)。 这发生在高山:

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 宏。