我发现自己有一个嵌套类和一个具有相同名称的成员函数。成员函数用于返回嵌套类的实例:
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'
这就引出了我的问题:
发布于 2014-03-27 15:17:02
我建议不要这样做,因为这只会使代码很难读懂。但是,如果您真的想继续下去,就必须继续用class关键字作为嵌套类的前缀。如果这在语法上是无效的,请使用typedef:
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不是引用它的有效方法。
https://stackoverflow.com/questions/22691821
复制相似问题