2012-08-17 31 views
10

我与Visual Studio 2003中的一个奇怪的情况下,对于有些正当的理由,我有以下层次:错误的名称解析当家长和内部类具有相同的名称

class A {}; 

class B : public A { 
public: 
    class A {}; 
}; 

class C : public B::A {}; 

也就是说,我有一个内类与外部类的父类具有相同的名称。当C试图从B::A继承时,Visual Studio认为我指向父类A,而不是B中的嵌套类。 GCC似乎解决了内部类的版本,因为我预期

这是一个Visual Studio 2003的错误,或者我做错了吗?是否有解决方法(除了升级Visual Studio)?

+0

Visual C++ 2003于九年前发布。升级有很多原因是明智的。 – 2012-08-17 16:36:25

+1

@JamesMcNellis如果我负责这些事情,我们已经很久以前升级了,但可惜我不是 – 2012-08-17 16:37:27

回答

2

是的,这看起来像VS2003的错误。解决方法很简单 - 使用typedef,它的工作方式如下:

class A { public: int x; }; 
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA; 

class C: public BA {}; 

void f() 
{ 
    C cc; 
    cc.y = 0; 
} 
5

这看起来像是Visual C++ 2003中的一个错误。使用Visual C++ 2012,B::A正确地命名嵌套类A,而不是基类A

+0

至于解决方法,我不知道:设计是相当可疑的。我会重命名嵌套的类。如果我安装了Visual C++ 2003,我会尝试查看发生了什么,但是我几年之后还没有使用过Visual C++ 2003。 – 2012-08-17 16:39:13

+0

我很笨,没有测试我的简单例子;事实证明这是错误的。更新后的版本再现问题 – 2012-08-17 17:04:28

+2

@MichaelMrozek VS 2012解析为内部类。 – ForEveR 2012-08-17 17:21:19

0

它看起来像一个VS bug,
我不知道感谢张贴。
我认为解决方法将是一个SafeInherit模板我不知道什么会是一个更好的名字。

template <typename T> 
struct SafeInherit{ 
    typedef T Type; 
}; 

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
}