将非类型参数包中的constexpr数组作为模板参数传递失败

时间:2017-09-08 08:31:30

标签: templates c++14 variadic-templates

我将参数包中的数组定义为constexpr。然后我想将此数组作为模板参数传递给另一个模板。但是,我收到外部链接错误。这里有什么问题?我认为constexpr可以很容易地作为模板参数转发。

// Example program
#include <array>
#include <iostream>
#include <string>


template <size_t X>
using iMat1D = std::array<size_t, X>;

template <size_t SizeOfDims, const iMat1D<SizeOfDims> &DIMs>
struct test{
  static void run() {
  }
};

template <std::size_t... DIMS> 
struct solver_walker {
  static void run() {
    constexpr std::size_t N = sizeof...(DIMS);
    constexpr std::array<size_t, N> dims = {{DIMS...}};
    test<N, dims>::run();
  };
};

int main()
{
    solver_walker<1,2,3,4>::run();
}

1 个答案:

答案 0 :(得分:1)

您正尝试将引用传递给dims作为模板参数。由于dims不是static变量,因此此引用不是常量表达式

您可以通过dims static变量来解决此问题:

template <std::size_t... DIMS> 
struct solver_walker {
  static void run() {
    constexpr std::size_t N = sizeof...(DIMS);
    static constexpr std::array<size_t, N> dims = {{DIMS...}};
    test<N, dims>::run();
  };
};

live example on wandbox