以下似乎是 ZeroC ICE 在自动生成的代码中采用的模式,在我看来,这是他们现在为其工具的许多版本制作单例(不知道为什么)的一种方式。各种编译器都没有问题,直到今天我发现 Visual Studio 2015 Update 1(VS 版本 14.0.24720.00,VC++ 版本 19.00.23506)发出错误。在Update 1之前,VS2015也没有问题。我不确定这是否是带有 Update 1 的 VS2015 C++ 编译器中的错误(回归?),或者是其他编译器忽略的错误(不符合标准)C++ 代码。
以下是代码模式的示例:
class Foo {
protected:
virtual ~Foo() {}
friend class Foo_init;
};
class Foo_init {
public:
Foo init;
};
static Foo_init staticFooInit;
VS2015 Update 1 发出以下错误:
example.cpp(13): error C2248: 'Foo::~Foo': cannot access protected member declared in class 'Foo'
example.cpp(3): note: see declaration of 'Foo::~Foo'
example.cpp(1): note: see declaration of 'Foo'
我找到了一个(尚未答复)ZeroC ICE 论坛帖子这似乎与此相关,但除此之外,我还没有在谷歌搜索中找到任何能让我相信这是编译器问题还是错误代码的东西。我承认我不太了解 ZeroC ICE,也没有充分使用 C++ 友元类来深入了解可以用它们做什么和不能做什么。我希望有更了解的人可以对此有所了解。
我不是 100% 确定你的确切问题,但它让我想起了我不久前遇到的一个问题,其中前向声明的类将具有意外的范围。这一页cpp引用类强调了规则,即前向声明的类具有最本地的范围。但是,您在我的 VS2015u3 上的示例也没有失败。
我认为解决方法可能是在类之前转发声明该类是友元,以便它具有明确定义的范围。
当你有这样的课程时
class Example {
int someFunction( class SomeOtherClass & param );
};
编译器将声明视为SomeOtherClass
是在本地范围内的。
这意味着
class Example {
int someFunction( class SomeOtherClass & param );
};
class SomeOtherClass {
...
};
声明三个类Example
Example::SomeOtherClass
and SomeOtherClass
将您的示例更改为
class Foo_init;
class Foo {
protected:
virtual ~Foo() {}
friend Foo_init;
};
class Foo_init {
public:
Foo init;
};
static Foo_init staticFooInit;
应该管用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)