如何根据另一个模板函数的依赖模板别名调用模板函数?
例如,有一个模板类和一个模板函数,它接受这个类作为模板参数:
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()
的正确方法是什么?