模板别名作为依赖名称

时间:2015-08-03 16:54:30

标签: c++ c++11 template-aliases

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

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

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 个答案:

没有答案