2012-08-17 40 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 {}; 
} 
相關問題