gpt4 book ai didi

C++:奇怪的 "is private"错误

转载 作者:可可西里 更新时间:2023-11-01 18:37:48 24 4
gpt4 key购买 nike

我从 g++ 中收到一个非常不寻常的错误,声称类型别名是私有(private)的。在减少代码数小时后,我得出了以下最小测试用例:

template <typename Dummy>
class Test {
struct CatDog {
static void meow ()
{
CrazyHouse::TheCatDog::meow();
}

struct Dog {
static void bark ();
};
};

struct CrazyHouse {
using TheCatDog = CatDog;

static void startMadness ()
{
TheCatDog::meow();
TheCatDog::Dog::bark();
}
};

public:
static void init ()
{
CrazyHouse::startMadness();
}
};

int main ()
{
Test<void> t;
t.init();
}

g++ 4.8.2 的错误是:

test.cpp: In instantiation of 'static void Test<Dummy>::CatDog::meow() [with Dummy = void]':
test.cpp:19:29: required from 'static void Test<Dummy>::CrazyHouse::startMadness() [with Dummy = void]'
test.cpp:27:34: required from 'static void Test<Dummy>::init() [with Dummy = void]'
test.cpp:34:12: required from here
test.cpp:15:33: error: 'using TheCatDog = struct Test<void>::CatDog' is private
using TheCatDog = CatDog;
^
test.cpp:6:41: error: within this context
CrazyHouse::TheCatDog::meow();
^

Clang 3.4 接受相同的代码。这是怎么回事,这是 g++ 错误吗?

执行以下任一操作可停止错误的发生:

  • Test 变成类,而不是模板类。
  • 删除任何函数中的任何语句。
  • TheCatDog::Dog::bark(); 更改为 CatDog::Dog::bark();
  • 删除 CrazyHouse 类并将其内容合并到 Test 中。
  • 删除 CatDog 类,将其内容合并到 Test 并将 TheCatDog 别名更改为指向 Test .

最佳答案

对标识符 CatDog 的名称查找找到声明为 privateTest::CatDog。访问是从 CrazyHouse 执行的,它不是 Testfriend。因此,这是对 protected 成员的非法访问。

正如@sj0h 指出的那样,在 C++11 中,您的示例变得有效,因为他们决定以与成员函数相同的方式扩展对嵌套类主体的访问。

C++98:

The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friendship to an enclosing class; the usual access rules (clause 11) shall be obeyed.

C++11:

A nested class is a member and as such has the same access rights as any other member.

(成员有权访问封闭类的 private 成员。)

但是,即使在最近构建的 4.9 版中,此更改似乎也没有在 GCC 中实现。所以,为了安全起见,添加一个 friend 声明不会有什么坏处。这必须在成员的定义之后:

friend struct CrazyHouse;

请注意,这并没有完成与 C++11 更改完全相同的事情,因为 friendship 不是可传递的,而嵌套成员授予的访问权限是可传递的。

关于C++:奇怪的 "is private"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083662/

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