gpt4 book ai didi

c++ - 如何解决 C++ 中嵌套类型的循环依赖?

转载 作者:太空狗 更新时间:2023-10-29 23:13:43 36 4
gpt4 key购买 nike

对于这样的代码:

// with forward declaration: error C2653: 'B': is not a class or namespace name
// without forward declaration: error C2027: use of undefined type 'B'
struct B;

struct A {
using size_t = int;
typename B::size_t index;
};

struct B {
using size_t = char;
typename A::size_t index;
};

void main() {
A a;
B b;
}

A 类和 B 类引用嵌套类型 size_t彼此。

但是像class A;这样的前向声明仅适用于在当前范围或外部范围内声明的类。

那么如何在不改变代码语义的情况下解决这种循环依赖?就像用前向声明解决更简单的情况一样,或者像 java 和 c# 一样没有任何循环依赖问题?


附言

感谢Galik的建议,本题中的原始例子

template <typename T>
class A {
using iterator = T*;
B<T>::iterator iter;
};

template <typename T>
class B {
using iterator = T*;
A<T>::iterator iter;
};

包含其他错误,例如 iterator无法访问,因为它们是私有(private)的,并且 typenameA<T>::iterator 之前需要.并且修复bug后,编译成功。 generic class 和 normal class 好像还是有区别的,所以我一开始就举了一个(normal class 的)例子,至少不能在 Visual Studio 2015 中编译。

最佳答案

我不确定 OP 想要回答的问题是什么。
此外,问题中的示例包含几个错误。

也就是说,这可能会解决。

您可以为两个类之一引入一个基类:

struct A_b {
using size_t = int;
};

struct B {
using size_t = char;
A_b::size_t index;
};

struct A: A_b {
B::size_t index;
};

int main() {
A a;
B b;
}

或者把其中一个变成模板类:

template<class T>
struct A_t {
using size_t = int;
typename T::size_t index;
};

struct B {
using size_t = char;
typename A_t<B>::size_t index;
};

using A = A_t<B>;

int main() {
A a;
B b;
}

等等……

关于c++ - 如何解决 C++ 中嵌套类型的循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37427259/

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