Псевдоним шаблона как зависимое имя
Как вызвать функцию шаблона на основе зависимого псевдонима шаблона другой функции шаблона?
Например, есть класс шаблона и функция шаблона, которая принимает этот класс в качестве аргумента шаблона:
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()
?