考虑以下简单程序:
#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”)可能在a中的某个点处不完整 翻译单位,稍后完成;类“X”是一样的 在两点都输入。
因此,类型A
在//1
处不完整,并且已在//2
处完成,因此标准表示在两个点都是相同的,这意味着类型类型已在//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