调用variadic类型的静态constexpr数组时未定义的引用

时间:2016-05-24 20:23:02

标签: c++ c++11

我有以下课程

$("[id$='test1']").show();

但我在调用template<int ... Args> struct foo { constexpr static int arr[sizeof...(Args)]={Args...}; constexpr int dimension(int i) {return arr[i];} }; 时得到undefined reference to arr。如果我在函数dimension内移动arr,则该函数不再是dimension,因为它在函数体内需要两个分号。例如,我做不到

constexpr

我的目标是以元编程方式迭代varidic模板的所有维度并将其与另一个整数进行比较?理想情况下,如果我有两个foo对象,我想确定它们在每个维度上是否相等。

1 个答案:

答案 0 :(得分:6)

每个使用odr的变量都需要一个定义。这样:

constexpr static int arr[sizeof...(Args)]={Args...};

是一个也初始化arr的声明,但它不是一个定义。所以你只需要提供一个定义,它必须是(1)类的外部和(2)仍然是constexpr。那就是:

template<int ... Args>
struct foo {
    constexpr static int arr[sizeof...(Args)]={Args...};
    constexpr int dimension(int i) const {return arr[i];}
};

template <int... Args>
constexpr int foo<Args...>::arr[sizeof...(Args)];

现在定义了foo<Args...>::arr