繁体   English   中英

为什么以下类型不完整?

[英]Why was the following type incomplete?

考虑以下简单程序:

#include <iostream>

struct A; //1

namespace B
{
    struct A //2
    {
        int a;
        A() : a(10){ }
        friend void foo(A* a);
    };
}

void foo(A* a)
{
    std::cout << a -> a << std::endl;
}

A* a = new A; //error: allocation of incomplete type

int main()
{
    foo(a);
}

演示

在上面的代码中,我们尝试将内存分配给不完整的类型。 但是为什么它不完整? 该标准表示N3797::3.9/6 [basic.types]

类类型(例如“类X”)在翻译单元中可能在某一时刻不完整,并在以后完成。 “ X类”类型在两点上都是相同的类型。

因此,类型A//1处不完整,而在//2处完成,因此,正如标准所说,两点都是相同的,这意味着类类型在//1处完成。 这就是为什么我不知道编译错误的原因。 你不能澄清吗?

我猜想// 1情况用于前向声明。
但是您不能这样做,因为A and B::A位于完全不同的位置。 因此可能是这样。

如果要使用前向声明,则必须将A放在相同的namespace
也许这会让我想说些什么。

#include <iostream>

namespace B{
struct A;
}

namespace B
{
    struct A
    {
    private:
        int a;
    public:
        A() : a(10){ }
        friend void foo(A * a);
    };

    void foo(A* a)
    {
        std::cout << a -> a << std::endl;
    }
}

B::A* a = new B::A;

int main()
{
    foo(a);
}

这是演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM