次の 2 つの構造体を指定すると、ネストされた「ネストされた」クラスの両方から派生し、派生オブジェクトから foo() と bar() を呼び出すことができます。
struct WithNested1 {
template<class T> struct Nested {
void foo();
};
};
struct WithNested2 {
template<class T> struct Nested {
void bar();
};
};
struct Test : WithNested1::Nested<Test>,
WithNested2::Nested<Test>
{
};
Test test;
test.foo();
test.bar();
しかし、両方の外部クラスが可変個引数のテンプレート引数として渡された場合、それらからどのように派生しますか?
たとえば、これはコンパイルに失敗します。
template<typename... Ts>
struct Test : Ts::template Nested<Test>...
{
};
Test<WithNested1, WithNested2> test;
test.foo();
test.bar();
エラー: 'foo': 'Test' のメンバーではありません
エラー: 'bar': 'Test' のメンバーではありません
奇妙なことに、foo() と bar() の呼び出しを削除するとコンパイルされます。