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

Templates 将非类型参数包中的constexpr数组作为模板参数传递失败,templates,c++14,variadic-templates,Templates,C++14,Variadic Templates,我将参数包中的数组定义为constexpr。然后我想把这个数组作为模板参数传递给另一个模板。但是,我得到一个外部链接错误。这里有什么问题?我认为constexpr可以很容易地作为模板参数转发 //示例程序 #包括 #包括 #包括 模板 使用iMat1D=std::array; 模板 结构测试{ 静态无效运行(){ } }; 模板 结构求解器{ 静态无效运行(){ constexpr std::size\u t N=sizeof…(DIMS); constexpr std::array dims=

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

//示例程序
#包括
#包括
#包括
模板
使用iMat1D=std::array;
模板
结构测试{
静态无效运行(){
}
};
模板
结构求解器{
静态无效运行(){
constexpr std::size\u t N=sizeof…(DIMS);
constexpr std::array dims={{dims…};
test::run();
};
};
int main()
{
解算器_walker::run();
}
您试图将对
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();
  };
};
模板
结构求解器{
静态无效运行(){
constexpr std::size\u t N=sizeof…(DIMS);
静态constexpr std::array dims={{dims…};
test::run();
};
};