1. ホーム
  2. c++

[解決済み] テンプレートエラー

2023-01-08 21:12:41

質問

clangをしばらく使っていて、テンプレートエラーから回復するためのヒントを提供することになっている "test/SemaTemplate/dependent-template-recover.cpp" (in the clang distribution) に行き当たりました。

全体は、最小限の例に簡単に剥ぎ取ることができます。

template<typename T, typename U, int N> struct X {
    void f(T* t)
    {
        // expected-error{{use 'template' keyword to treat 'f0' as a dependent template name}}
        t->f0<U>();
    }
};

clangが出力するエラーメッセージです。

tpl.cpp:6:13: error: use 'template' keyword to treat 'f0' as a dependent template name
         t->f0<U>();
            ^
            template 
1 error generated.

... しかし、具体的にどこに template キーワードを挿入すれば、構文的に正しいコードになるのでしょうか?

どのように解決するのですか?

ISO C++03 14.2/4:

メンバーテンプレート特殊化の名前がpostfix-expressionの.や->の後、またはqualified-idのnested-name-specifierの後に現れ、postfix-expressionまたはqualified-idが明示的にテンプレートパラメータに依存する場合 (14.6.2). メンバーテンプレート名の前にキーワードtemplateを付けなければなりません。 . そうでない場合は、テンプレートでない名前とみなされます。

t->f0<U>(); f0<U> はメンバーテンプレート特化型であり -> の後に表示され、テンプレートパラメータ U であるため、メンバーテンプレートの特殊化はプレフィックスとして template キーワードが必要です。

そこで変更 t->f0<U>()t->template f0<U>() .