我希望两个类中的类型声明相互依赖.这是第一个用clang和gcc编译的例子:
template <class Sum>
struct A
{
using X = char; // (1)
using Z = typename Sum::B::Y; // (2)
};
template <class Sum>
struct B
{
using Y = typename Sum::A::X;
};
struct AplusB
{
using A = ::A<AplusB>;
using B = ::B<AplusB>;
};
AplusB::A::Z z;
int main() {}
Run Code Online (Sandbox Code Playgroud)
然而,有一个有趣的时刻.如果你交换行(1)和(2),那么它将无法编译并出现错误:
错误:'A'中没有名为'X'的类型
这让我怀疑原始代码在C++标准意义上是否真的有效,或者它恰好编译?
这是第二个例子,它也利用了模板实例化的顺序:
template <class Sum>
struct A
{
using X = char;
using P = typename Sum::B::Q;
};
template <class Sum>
struct B
{
using Y = typename …Run Code Online (Sandbox Code Playgroud)