当试图通过pimpl习语定义一个类时,我尝试通过将类向前声明滚动到pimpl定义来保存一行代码。声明内部类名称作为另一个声明的一部分
class A
{
public:
class Impl *pimpl;
};
上述声明编译得很好。什么不起作用,是定义A::Impl
的尝试。 As the program bellow demonstrates:
class A
{
public:
class Impl *pimpl;
};
class A::Impl
{
};
int main() {
// your code goes here
return 0;
}
它与结果:
error: qualified name does not name a class before '{' token
现在,一个可以引入新的班级名称,由一个复杂的类型说明,作为另一个声明的一部分。但实际上Class ::Impl
就是introduced。
class A
{
public:
class Impl *pimpl;
};
class Impl
{
};
int main() {
Impl i;
A a;
a.pimpl = &i;
return 0;
}
为什么是它在它自己的行前向声明(如成语经常使用),将引进A::Impl
,但作为指针定义的一部分声明时,将引入::Impl
?
更新
我不问如何使成语工作。我的问题是,为什么单行
class Impl *pimpl;
没有因为两行
class Impl;
Impl *pimpl;
在一个类定义的情况下相同的效果。
我很困惑,因为名字在something similar is done in the context of a namespace时变得合格。
namespace A
{
class Impl *pimpl;
};
class A::Impl
{
};
int main() {
// your code goes here
return 0;
}
我知道如何让它按预期工作。这不是我的问题。我想我应该删除'pimpl'标签。 – StoryTeller