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