C++ C++;为什么循环依赖可以在类中实现,而不能在命名空间或全局范围中实现?

C++ C++;为什么循环依赖可以在类中实现,而不能在命名空间或全局范围中实现?,c++,circular-dependency,C++,Circular Dependency,我在中遇到了以下代码 为什么在这种情况下我可以调用方法Bb(),但是如果我将struct-other\u-program更改为namespace-other\u-program,它会生成一个编译器错误 我已经读过,我想问的是:如果可以调用类/结构/联合中未定义的方法,为什么名称空间的工作方式不一样?我对这种行为背后的动机感兴趣 (对于文章中提出的编码风格感兴趣的人) < P>这只是C++中类和命名空间的工作方式。类必须将整个(类成员)名称集作为候选名称,因为否则您将有巨大的负担来排序类成员,并且

我在中遇到了以下代码

为什么在这种情况下我可以调用方法
Bb()
,但是如果我将
struct-other\u-program
更改为
namespace-other\u-program
,它会生成一个编译器错误

我已经读过,我想问的是:如果可以调用类/结构/联合中未定义的方法,为什么名称空间的工作方式不一样?我对这种行为背后的动机感兴趣


(对于文章中提出的编码风格感兴趣的人)

< P>这只是C++中类和命名空间的工作方式。类必须将整个(类成员)名称集作为候选名称,因为否则您将有巨大的负担来排序类成员,并且可能无法方便地首先排序公共接口


另一方面,名称空间的工作方式与C函数几乎完全相同,并且按照它们在源文件中列出的顺序进行顺序处理。不需要特殊功能,因为在命名空间/全局范围内调用函数之前,始终可以声明函数。

在类和命名空间中都可以实现循环依赖。这只是在循环依赖情况下正确定义事物的问题

在您的例子中,由于类成员函数定义中的特殊处理,使用
struct-otherful_程序编译的代码
:允许它们在当前点的上方和下方“查看”封闭类的整个定义。但他们无法看到封闭名称空间的整个定义。对于名称空间,编译器只看到在当前点上方声明的内容

类和名称空间是非常不同的东西,因此在实践中通常不会出现在这两者之间自由切换的问题。但是,为了便于说明,这在许多情况下都可以实现,包括您的人工示例

namespace entire_program   
{
    struct B;

    struct A
    {
        B *bbb;
        void Aa();
    };

    struct B
    {
        A aaa;
        void Bb() { A aa; aa.Aa(); }
    };
}

inline void entire_program::A::Aa()
{
  B bb; bb.Bb();
}   

我上面的实现与您的实现具有相同的效果,但它不依赖于对成员函数的特殊处理。如果愿意,您可以在
struct thigh_program
namespace thigh_program
之间自由切换。请记住名称空间定义没有
在关闭
}

之后,它们不会以这种方式工作,因为它们从来没有打算以这种方式工作-名称空间允许在随机位置进行随机声明,而类/结构/联合声明必须在同一个文件中
namespace entire_program   
{
    struct B;

    struct A
    {
        B *bbb;
        void Aa();
    };

    struct B
    {
        A aaa;
        void Bb() { A aa; aa.Aa(); }
    };
}

inline void entire_program::A::Aa()
{
  B bb; bb.Bb();
}