我发现自己有一个嵌套类和一个具有相同名称的成员函数。成员函数旨在返回嵌套类的实例:
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'
这引出了我的问题:
答案 0 :(得分:1)
我建议反对它,因为它只会让代码真的难以阅读。但是如果你真的想要继续,你必须使用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
不是引用它的有效方式。