gpt4 book ai didi

c++ - 奇怪的模板行为

转载 作者:行者123 更新时间:2023-11-28 00:07:20 25 4
gpt4 key购买 nike

以下代码无法编译。:-

#include <vector>

template <typename T>
struct B;

template <typename T>
struct A
{
B<T> _a;
};

template <typename T>
struct B
{
A<T> _b;
};


int main()
{
B<int> c;

return 0;
}

乍一看,接缝的原因似乎是 A 和 B 之间的循环依赖。但是,当没有显式使用类型 B _b 成员时,使用了 vector (存储实际对象而不是指向它的指针)。像这样

#include <vector>

template <typename T>
struct B;

template <typename T>
struct A
{
std::vector<B<T>> _a;
};

template <typename T>
struct B
{
A<T> _b;
};


int main()
{
A<int> c;

return 0;
}

,一切正常。问题是为什么?如果 vector 只需要 B,T> 结构的大小,那么第一个示例中 A 的任何部分都需要,因为它不调用任何 B 的函数。

最佳答案

在你的第一个例子中 sizeof(A<int>)sizeof(B<int>)递归定义。问问自己:什么是 sizeof(A<int>)

你不能回答因为sizeof(A<int>)取决于 sizeof(B<int>)并递归。

在第二个例子中sizeof(A<int>)sizeof(std::vector<B<int>>)这是常数,确实std::vector进行堆分配。

尝试替换std::vector通过 std::array你会再次遇到同样的问题。确实std::array的大小取决于元素的大小。

关于c++ - 奇怪的模板行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34811690/

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