[英]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.