gpt4 book ai didi

C++11 : Recursion in a stacked variadic struct (I get an linker error)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:20 25 4
gpt4 key购买 nike

我想实现一个模板递归算法,我转发两个可变参数并递减变量 K。我认为最简单的方法是堆叠两个 struct 的定义。但是,如果我尝试在 constexpr 上进行调试输出,则会出现链接器错误。如果我只是在非堆栈结构中执行类似的方法代码,它似乎会起作用。

: In function `void detail::L1<3ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::run<int, int, int, int>(int, int, int, int)':
: undefined reference to `detail::L1<3ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::dim_array'
: In function `void detail::L1<2ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::run<int, int, int, int>(int, int, int, int)':
: undefined reference to `detail::L1<2ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::dim_array'
: In function `void detail::L1<1ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::run<int, int, int, int>(int, int, int, int)':
: undefined reference to `detail::L1<1ul, 4ul, 3ul, 2ul, 1ul>::L2<2ul, 3ul, 4ul, 5ul>::dim_array'

代码

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

template <size_t K, std::size_t... IDs>
struct L1 {
template <std::size_t... DIMS>
struct L2 {
static constexpr std::array<size_t, sizeof...(DIMS)> dim_array = {{DIMS...}};

static void run() {
constexpr size_t n = dim_array[K];

for(int i = 0; i < sizeof...(DIMS); i++) {
std::cout<<dim_array[i]<<" ";
}
std::cout << std::endl;

L1<K-1, IDs...>::template L2<DIMS...>::run();
}
};
};

template <std::size_t... IDs>
struct L1<0, IDs...> {
template <std::size_t... DIMS>
struct L2 {
static constexpr std::array<size_t, sizeof...(DIMS)> dim_array = {{DIMS...}};
static void run() {
}
};
};

int main() {
L1<3, 4,3,2,1>::template L2<2,3,4,5>::run();
}

作品:

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

template <std::size_t... DIMS> // Define dimensions of the ctrl point grid. E.g. 4x4x4
struct works {
static void run() {
static constexpr std::array<size_t, sizeof...(DIMS)> dim_array = {{DIMS...}};
for(int i = 0; i < sizeof...(DIMS); i++) {
std::cout<<dim_array[i]<<" ";
}
std::cout << std::endl;
}
};

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

最佳答案

在我看来,您忘记添加(在结构之外)以下几行

template <std::size_t K, std::size_t... IDs>
template <std::size_t ... DIMS>
constexpr std::array<std::size_t, sizeof...(DIMS)>
L1<K, IDs...>::L2<DIMS...>::dim_array;

template <std::size_t K, std::size_t... IDs>
template <std::size_t ... DIMS>
constexpr std::array<std::size_t, sizeof...(IDs)>
L1<K, IDs...>::L2<DIMS...>::id_array;

我的意思是...您已经声明了 dim_arrayid_array 但您还没有定义它们。

p.s.: 我已经将你问题的标签从 c++11 修改为 c++14 因为,如果你编译

constexpr size_t n = dim_array[K];

你编译的c++14代码(std::array中的operator[]constexpr,从c++14开始)

-- 编辑 --

OP

Seems not to work, but if I move the definition of dim_array into the function it compiles :/

抱歉:我回答了你原来的问题;你修改了它(删除 id_array)所以你只需要添加 dim_array 的定义。

下面的代码对我来说没问题(好吧...嗯...有一些警告)

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

template <size_t K, std::size_t... IDs>
struct L1 {
template <std::size_t... DIMS>
struct L2 {
static constexpr std::array<size_t, sizeof...(DIMS)> dim_array = {{DIMS...}};

static void run() {
constexpr size_t n = dim_array[K];

for(int i = 0; i < sizeof...(DIMS); i++) {
std::cout<<dim_array[i]<<" ";
}
std::cout << std::endl;

L1<K-1, IDs...>::template L2<DIMS...>::run();
}
};
};

template <std::size_t... IDs>
struct L1<0, IDs...> {
template <std::size_t... DIMS>
struct L2 {
static constexpr std::array<size_t, sizeof...(DIMS)> dim_array = {{DIMS...}};
static void run() {
}
};
};

template <std::size_t K, std::size_t... IDs>
template <std::size_t ... DIMS>
constexpr std::array<std::size_t, sizeof...(DIMS)> L1<K, IDs...>::L2<DIMS...>::dim_array;

int main() {
L1<3, 4,3,2,1>::template L2<2,3,4,5>::run();
}

而且,是的:如果您将 dim_array 的定义移动到 run() 中,它就可以工作。因为,在那种情况下,声明也是定义。

关于C++11 : Recursion in a stacked variadic struct (I get an linker error),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46079598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com