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

Tas*_*kie 1 c++ c++11

我有以下课程

template<int ... Args>
struct foo {
    constexpr static int arr[sizeof...(Args)]={Args...};
    constexpr int dimension(int i) {return arr[i];}
};
Run Code Online (Sandbox Code Playgroud)

但我undefined reference to arr在打电话的时候得到了dimension.如果我arr在函数内部移动,dimension那么函数就不再是函数constexpr,因为它需要在函数体内有两个分号.例如,我做不到

constexpr int a = foo_obj.dimension(2);
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 6

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

constexpr static int arr[sizeof...(Args)]={Args...};
Run Code Online (Sandbox Code Playgroud)

是一个也初始化的声明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)];
Run Code Online (Sandbox Code Playgroud)

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