タイプエイリアスがプライベートであると主張するg ++から非常に珍しいエラーが発生しました。コードを何時間も削減した後、次の最小限のテスト ケースにたどり着きました。
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();
^
Clang 3.4 は同じコードを受け入れます。ここで何が起こっているのですか、これは g++ のバグですか?
次のいずれかを実行すると、エラーが発生しなくなります。
- テンプレート
Testクラスではなく、クラスに変換します。 - 関数内のステートメントを削除します。
- に変わり
TheCatDog::Dog::bark();ますCatDog::Dog::bark();。 - クラスを削除し、
CrazyHouseその内容を にマージしTestます。 - クラスを削除し、
CatDogその内容を にマージして、エイリアスを にTest変更します。TheCatDogTest