gpt4 book ai didi

c++ - 同名的嵌套类和成员函数

转载 作者:太空狗 更新时间:2023-10-29 23:04:31 29 4
gpt4 key购买 nike

我发现自己有一个嵌套类和一个同名的成员函数。成员函数旨在返回嵌套类的实例:

class Foo
{
public:
class Lock
{
// Operations that require the lock...
};

Lock Lock() noexcept {return Lock;}
};

这可以理解地不起作用,所以我正在寻找解决它的方法并尝试了:

return typename Foo::Lock();

这在 g++ 4.7 和 4.8 上运行良好,但在 clang++ 3.4 上运行时出现错误:

没有 c++11:错误:类型名称说明符引用“Foo”中的非类型成员“Lock”使用 c++11: 'error: typename specifier refers to non-type member 'Lock' in 'Foo'

这引出了我的问题:

  • 哪些是正确的?
  • 有没有办法像示例中那样在成员函数中引用嵌套类?

最佳答案

我不建议这样做,因为它只会让代码很难阅读。但是如果你真的想继续,你必须继续在嵌套类前面加上 class 关键字。在语法上无效的地方,使用 typedef:

class Foo
{
public:
class Lock
{
// Operations that require the lock...
};

class Lock Lock() noexcept {
typedef class Lock cLock;
return cLock();
}
};

Live example

至于错误,clang 在这个错误上是正确的。你不能像这样使用 typename 来消除歧义,我认为它根本不应该在模板之外使用。

标准引用:

  • C++11[class.name]§4 指定 Lock 如何隐藏 class Lock 以及如何访问它作为 class Lock

  • C++11[class.name]§2 指出:

    If a class name is declared in a scope where a variable, function, or enumerator of the same name is also declared, then when both declarations are in scope, the class can be referred to only using an elaborated-type-specifier

    elaborated-type-specifierclass X 形式。请注意,这意味着 typename Foo::Lock 不是引用它的有效方式。

关于c++ - 同名的嵌套类和成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691821/

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