gpt4 book ai didi

c++ - VS2015 更新 1 个错误,或错误的 C++ : Why can't a friend class access its friend's protected destructor?

转载 作者:可可西里 更新时间:2023-11-01 15:28:51 26 4
gpt4 key购买 nike

以下似乎是 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 forum post这似乎与此有关,但除此之外,我还没有在我的谷歌搜索中发现任何让我相信这是编译器问题还是错误代码的东西。我承认我对 ZeroC ICE 不是很了解,我对 C++ 友元类的使用也不够深入,无法深入了解你可以用它们做什么,不能用它们做什么。我希望更有知识的人可以对此有所了解。

最佳答案

我不是 100% 确定您的确切问题,但这让我想起了我前一段时间遇到的一个问题,前向声明的类会有一个意想不到的范围。本页cppreference class突出显示规则,即前向声明的类具有最局部范围。但是,您在我的 VS2015u3 上的示例也没有失败。

我认为修复可能是在类之前转发声明友元类,以便它具有明确定义的范围。

当你有一个类时

class Example {
int someFunction( class SomeOtherClass & param );
};

编译器处理在局部范围内的 SomeOtherClass 的声明。

这意味着

class Example {
int someFunction( class SomeOtherClass & param );
};

class SomeOtherClass {
...
};

声明了三个类 Example Example::SomeOtherClassSomeOtherClass

将您的示例更改为

class Foo_init;

class Foo {
protected:
virtual ~Foo() {}

friend Foo_init;
};

class Foo_init {
public:
Foo init;
};

static Foo_init staticFooInit;

应该可以

关于c++ - VS2015 更新 1 个错误,或错误的 C++ : Why can't a friend class access its friend's protected destructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com