4

適切な構文が見つからないコードの一部を最小限の例に減らしました。

次の定義を仮定しましょう (「理由」について心配する必要はありません ;)

template <class>
class Element
{};

template <template <class> class>
class Client
{};

template <class>
struct TemplatedProvider
{
    template <class T>
    using element_template = Element<T>;
};

現在、C++11 以降では、クラス テンプレートまたは型エイリアス テンプレートのいずれかを使用して、テンプレートをインスタンス化できますClient。次の関数は問題なくコンパイルされます。

void fun()
{
    Client<Provider::element_template> client;
    Client<TemplatedProvider<int>::element_template> clientBis;
}

しかし、次の場合、与えられたテンプレート引数Clientが従属名である場合、適切な構文を見つけることができません:

template <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::element_template> client;
}

Clang (3.6 でテスト済み) は、次のコンパイル エラーを出力しています。

template argument for template template parameter must be a class template or type alias template

この構文を修正できますか?

4

2 に答える 2

9

次のようにする必要があります。

template <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::template element_template> client;
}
于 2015-10-29T15:16:30.297 に答える
4

template次のキーワードを使用できます。

template <class T>
void templatedFun()
{
    Client<TemplatedProvider<T>::template element_template> client;
}

およびキーワードの詳細については、この質問を参照してください。templatetypename

于 2015-10-29T15:17:41.270 に答える