別のテンプレート関数の依存テンプレート エイリアスに基づいてテンプレート関数を呼び出す方法は?
たとえば、テンプレート クラスと、このクラスをテンプレート引数として受け入れるテンプレート関数があります。
template<typename... T>
struct FooClass {
static int foo() { return 42; }
};
template<template<typename...> class T>
void printFoo() {
std::cout << T<>::foo() << std::endl;
}
次に、 へのテンプレート エイリアスを含むクラスがありますFooClass
。
struct MyClass {
template<typename... U>
using FooAlias = FooClass<U...>;
};
最後に、別のテンプレート関数があります。これはMyClass
テンプレート引数として受け取り、それを使用して適切な型でFooAlias
呼び出します。printFoo
template<typename T>
void lookUpAndPrintFoo() {
// printFoo<FooClass>(); //< works
// printFoo<MyClass::FooAlias>(); //< works
printFoo<typename T::FooAlias>(); //< does not compile
}
int main() {
lookUpAndPrintFoo<MyClass>();
return 0;
}
テンプレート引数に依存しない目的のクラスまたはそのエイリアスを直接使用すると、すべて問題ありません。依存エイリアスを使用しようとするとすぐに、次のエラー メッセージが表示されます。
prog.cpp: In instantiation of 'void lookUpAndPrintFoo() [with T = MyClass]':
prog.cpp:26:29: required from here
prog.cpp:22:32: error: 'typename MyClass::FooAlias' names 'template<class ... U> using FooAlias = struct FooClass<U ...>', which is not a type
printFoo<typename T::FooAlias>();
^
T::FooAlias
に渡す適切な方法は何printFoo()
ですか?