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

时间:2014-03-27 15:13:14

标签: c++ c++11 g++ clang++

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

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'

这引出了我的问题:

  • 其中哪一项是正确的?
  • 有没有办法在成员函数中引用嵌套类,如示例所示?

1 个答案:

答案 0 :(得分:1)

我建议反对它,因为它只会让代码真的难以阅读。但是如果你真的想要继续,你必须使用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声明:

      

    如果在声明了同名变量,函数或枚举数的作用域中声明了类名,那么当两个声明都在作用域中时,只能使用详细说明的类来引用该类。类型说明符

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