12

曖昧さ回避に使用されるテンプレートキーワードに関する情報を見つけようとしていますが、それについては何もありません。おそらく私は間違ったキーワードを検索していますが、標準では.templateや->templateのようなものはありません。Googleは、さまざまなフォーラムからのGCCの問題のみを示していますが、それが何に使用されているのかについては実際には説明していません。

そのようなコードは、11行目(GCC上)にtemplateキーワードなしでコンパイルできませんでしたが、これが標準に準拠しているかどうかはよくわかりません。

template<typename B>
struct S1
{
    template<typename T> void test() {}
};

template<typename T>
struct S2
{
    S2()
    {
        S1<T>().template test<int>();
    }
};

int main()
{
   S2<int>();
}

だから私の質問は、なぜここでテンプレートキーワードが使用されるのか、そのキーワードなしでどのような曖昧さが存在するのか、そしてそれについてどこで読むことができるのかということです(標準へのリンクを本当にいただければ幸いです)。

ありがとう。

4

1 に答える 1

10

簡単な答え:標準がそう言っているので

ISO C ++ 0314.2/4

メンバーテンプレートの特殊化の名前が。の後に表示される場合。または->postfix-expressionの場合、または修飾IDのnested-name-specifierの後に、postfix-expressionまたはqualified-idが明示的にtemplate-parameter(14.6.2)に依存する場合、メンバーのテンプレート名は次のようになります。キーワードテンプレートのプレフィックス。それ以外の場合、名前は非テンプレートの名前であると見なされます。

PS:

テンプレートを余分に使用しないと、コンパイラは(<)、後続の小なりトークンが実際には「小なり」ではなく、テンプレート引数リストの先頭であることを認識しません。

于 2010-11-02T11:27:50.873 に答える