0

如何根据另一个模板函数的依赖模板别名调用模板函数?

例如,有一个模板类和一个模板函数,它接受这个类作为模板参数:

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

4

0 回答 0