【问题标题】:friend class cannot access protected member朋友类无法访问受保护的成员
【发布时间】:2015-12-23 09:28:05
【问题描述】:

此代码过去在 Visual Studio 2015 中运行良好,但不再适用于 Visual Studio 2015 更新 1。

class Foo
{
protected:

    virtual ~Foo() {};
    friend class Foo__init;
};

class Foo__init
{
public:

    Foo _init;
};

static Foo__init _Foo_init;

它失败并出现以下错误:

Error   C2248   'Foo::~Foo': cannot access protected member declared in class 'Foo'

这是编译器错误还是代码格式错误?

【问题讨论】:

  • 我不是在问这个。 :)
  • 如果你把class Foot__init;放在Foo的定义之前会发生什么?
  • 这是stackoverflow.com/questions/34376316/…的完全相同的副本
  • 另外,删除_Capitaldouble__underscore。这些名称是保留的。
  • @T.C.如果您就其中任何一个问题写下答案,我们可以将其中一个标记为重复;)

标签: c++ visual-studio-2015


【解决方案1】:

来自here

友元声明出现在类主体中,并授予函数或其他类访问友元声明所在类的私有和受保护成员的权限。

所以这是一个编译器错误。 g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2) 都编译这段代码(我添加了int main() {})。

【讨论】:

  • 这确实是一个错误,但这并不能通过说其他主要供应商编译它而 VC++ 没有;)
【解决方案2】:

这是一个编译器错误。它适用于VS2008

【讨论】:

  • 相当肯定是一个编译器错误,但需要析构函数来销毁 Foo 成员,这应该只工作,因为朋友类。
  • 是的,在当前场景中,我们没有任何 Foo 对象。奇怪的是为什么它试图访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2015-01-30
相关资源
最近更新 更多