为什么以下类型不完整?

时间:2014-12-13 05:58:15

标签: c++ class

考虑以下简单程序:

#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);
}

DEMO

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

  

类类型(例如“类X”)可能在a中的某个点处不完整   翻译单位,稍后完成;类“X”是一样的   在两点都输入。

因此,类型A//1处不完整,并且已在//2处完成,因此标准表示在两个点都是相同的,这意味着类型类型已在//1。这就是编译错误对我来说不清楚的原因。你不能澄清吗?

1 个答案:

答案 0 :(得分:2)

我猜// 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);
}

这是 DEMO