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

时间:2017-05-29 17:49:06

标签: c++ templates libstdc++ 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;
}

将使用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
                  ^
在我看来,宏观扩张在这里非常有用。 任何解释都表示赞赏

1 个答案:

答案 0 :(得分: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宏。