1. ホーム
  2. c++

明示的な型パラメータを持つテンプレート・メンバー関数を呼び出そうとするとエラーが発生するのはなぜですか?

2023-10-14 12:16:19

質問

私はそれを理解しません、それはへの呼び出しがあるように私には思えます。 f の呼び出しは完全に曖昧ではないのですが、コンパイル時に expected primary-expression before ‘int’ . を呼び出している行をコメントアウトすると f を呼び出す行をコメントアウトすると、うまくコンパイルされます。

template<typename T>
struct A {
    template<typename S>
    void f() { }
};

template<typename T>
struct B : A<T> {
    void g() {
        this->f<int>();
    }
};

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

これは、テンプレートの引数に型が依存するオブジェクトのテンプレート関数にアクセスしようとするテンプレートがある場合、標準の実に不明瞭な条項によるものです。 template キーワードを使わなければならないからです。

this->template f<int>();

の変なところと似ています。 typename での奇妙さに似ていますが、関数に適用されることを除けば、従属型に現れます。 特に、もしあなたが template キーワードを省くと、以下のようなパース上の曖昧さが生じます。

this->f<int>()

(あなたが意図したもの)、そして

((this->f) < int) > ()

となっており、意味がありません(そのためエラーになります)。 キーワードの使用は template というキーワードを使うことで、コンパイラは曖昧さをなくし、文字化けしたシンボルの塊ではなく、テンプレート化されたメンバ関数への完全に有効な呼び出しを見ていることを認識するように強制されます。

これが役に立つことを願っています。