繁体   English   中英

嵌套类和具有相同名称的成员函数

[英]Nested class and member function with same name

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

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: error: typename specifier refers to non-type member 'Lock' in 'Foo'使用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();
    }
};

实例

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

标准参考:

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

  • C++11[class.name]§2声明:

    如果在声明了同名变量,函数或枚举器的作用域中声明了类名,那么当两个声明都在作用域中时,只能使用elaborated-type-specifier引用该类。

    详细类型说明符class X表单。 请注意,这意味着typename Foo::Lock不是引用它的有效方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM