【发布时间】:2020-04-13 00:40:32
【问题描述】:
我用类似于std::list 的 API 实现了一个列表,但编译失败
struct A { my_list<A> v; };
该列表有一个基类,该基类有一个成员 base_node,该成员具有 prev 和 next 字段,node(派生自 base_node)拥有 T 值(即列表的模板参数)。编译错误是
error: ‘node<T>::val’ has incomplete type
T val;
^~~
note: forward declaration of ‘struct A’
我查看了 GCC 代码,似乎它们拥有一个大小为 T 的字节缓冲区,所以不确定它是如何为它们工作的。 std::list 如何将A 存储在其节点中?
[更新]
struct A { };
template <typename T>
struct B : public A
{
using B_T = B<T>;
T t;
};
template <typename T>
class C
{
using B_T = typename B<T>::B_T; // this fails to compile
//using B_T = B<T>; // this compiles fine
};
struct D { C<D> d; };
【问题讨论】:
-
您对代码的描述非常模糊不清。我无法得到
my_list、node和base_node之间的关系。尝试使用可重现的示例更新 Q。 -
代码很长。
struct A { std::list<A> v; };取自 LLVM 测试并编译,但我不确定如何编译。我不确定他们如何将列表节点持有的类型从列表编译中分离出来 -
无法根据您的图表和描述重现:coliru.stacked-crooked.com/a/b41e97113d13de05
-
可能粘贴的编译器错误后面跟着一系列“需要来自...”的注释,这可能有助于找出导致问题的代码中的内容而不是我的代码。
-
@aschepler 谢谢。我能够用您的代码重现它,我将根据您的示例重构我的代码,请随时写一个答案以便我可以接受它coliru.stacked-crooked.com/a/450f05eba3710a7b