首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同名嵌套类和成员函数

同名嵌套类和成员函数
EN

Stack Overflow用户
提问于 2014-03-27 15:13:13
回答 1查看 730关注 0票数 3

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

代码语言:javascript
复制
class Foo
{
public:
    class Lock
    {
        // Operations that require the lock...
    };

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

这是可以理解的,但没有起作用,所以我正在寻找绕过它的方法,并尝试:

代码语言:javascript
复制
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'

这就引出了我的问题:

  • 其中哪一个是正确的?
  • 是否有一种方法来引用成员函数中的嵌套类,如示例中所示?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 15:17:02

我建议不要这样做,因为这只会使代码很难读懂。但是,如果您真的想继续下去,就必须继续用class关键字作为嵌套类的前缀。如果这在语法上是无效的,请使用typedef:

代码语言:javascript
复制
class Foo
{
public:
    class Lock
    {
        // Operations that require the lock...
    };

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

Live example

至于错误,克莱昂在这个问题上是正确的。您不能像这样使用typename来消除歧义,而且我认为它不应该在模板之外使用。

标准参考资料:

  • C++11[class.name]§4指定Lock如何隐藏class Lock以及如何以class Lock的形式访问它。
  • C++11[class.name]§2指出: 如果类名是在声明相同名称的变量、函数或枚举数的作用域中声明的,那么当两个声明都在作用域中时,只能使用精化类型说明符来引用类。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22691821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档