我从 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
并将TheCatDog
别名更改为指向Test
.