4

clang 3.0 と g++ 4.8.1 はどちらも、コメントに示されているエラーで次のコードを拒否します。

template<typename T>
struct S
{
    void f()
    {
        this->dependent(); // no error: type of 'this' is dependent?
        this->Dependent::dependent(); // error: 'Dependent' has not been declared
    }
};

[basic.lookup.classref]によると

に続くクラス名または名前空間名。or -> 演算子は、postfix-expression 全体のコンテキストと、オブジェクト式のクラスのスコープの両方で検索されます。

そして [temp.dep.expr]

this囲んでいるメンバー関数のクラス型が依存している場合、型依存です。

class-or-namespace-nameDependentがオブジェクト式のクラスのスコープ内で検索され、オブジェクト式thisのクラスが依存している場合、テンプレートがインスタンス化されるまでこの検索を延期すべきではありませんか? 標準は正しい動作を指定していますか?

EDIT:clang 3.0は次のコードを受け入れますが、g ++ 4.8は上記と同じエラーを返します

template<typename T>
struct S
{
    T m;
    void f()
    {
        m.dependent();
        m.Dependent::dependent();
    }
};
4

1 に答える 1

2

最初のコードでは、「this」が現在のインスタンス化を参照しているが、メンバーが見つからず、クラス テンプレートに依存する基本クラスがないため、両方の行が「形式が正しくなく、診断は必要ありません」です。

現在のインスタンス化のメンバーでも、未知の専門化のメンバーでもありません。14.6.2.1p6 を参照

于 2013-07-10T09:28:14.203 に答える