我一直在從g ++聲稱一個類型別名是私人的非常不尋常的錯誤。之後減少我的代碼的時間,我已經得出了以下的最小測試案例:C++:奇怪的是「私人」的錯誤
template <typename Dummy>
class Test {
struct CatDog {
static void meow()
{
CrazyHouse::TheCatDog::meow();
}
struct Dog {
static void bark();
};
};
struct CrazyHouse {
using TheCatDog = CatDog;
static void startMadness()
{
TheCatDog::meow();
TheCatDog::Dog::bark();
}
};
public:
static void init()
{
CrazyHouse::startMadness();
}
};
int main()
{
Test<void> t;
t.init();
}
使用g ++ 4.8.2的錯誤是:
test.cpp: In instantiation of 'static void Test<Dummy>::CatDog::meow() [with Dummy = void]':
test.cpp:19:29: required from 'static void Test<Dummy>::CrazyHouse::startMadness() [with Dummy = void]'
test.cpp:27:34: required from 'static void Test<Dummy>::init() [with Dummy = void]'
test.cpp:34:12: required from here
test.cpp:15:33: error: 'using TheCatDog = struct Test<void>::CatDog' is private
using TheCatDog = CatDog;
^
test.cpp:6:41: error: within this context
CrazyHouse::TheCatDog::meow();
^
鏘3.4接受相同的代碼。這裏發生了什麼,這是一個g ++的bug?
進行下列任何操作,從發生的歷史停止錯誤:
- 談到
Test
成一類,而不是一個模板類。 - 刪除任何函數中的任何語句。
- 將
TheCatDog::Dog::bark();
更改爲CatDog::Dog::bark();
。 - 刪除
CrazyHouse
類併合並它的內容Test
。 - 刪除
CatDog
類,將其內容合併到Test
中並將TheCatDog
別名更改爲指向Test
。
最有可能的是。 – Shoe