Псевдоним шаблона как зависимое имя

Как вызвать функцию шаблона на основе зависимого псевдонима шаблона другой функции шаблона?

Например, есть класс шаблона и функция шаблона, которая принимает этот класс в качестве аргумента шаблона:

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()?

0 ответов

Другие вопросы по тегам