3

次のC++コード:

template <typename T>
static void execute(T& obj) {
    obj.template operator()<int>();
}

IBMのxlC11.1でコンパイルすると、次のエラーメッセージが表示されます。1540-0063(S)テキスト「operator」は予期しないものです。演算子の代わりに関数を使用すると、正常に機能しますが、多くのライブラリコードを書き直したくありません。.template operatorコンストラクトをxlCで機能させる他の方法はありますか?

4

1 に答える 1

3

コンストラクトを機能させる最良の方法は.template operator、バグレポートをIBMに提出することです。

このコードはC++標準に準拠しています。実際、これがこのコードを書くための唯一の合法的な方法です。


レポートを提出するとき、証拠として以下を使用できます。

§14.2/4状態:

メンバーテンプレートの特殊化の名前が。の後に表示される場合。または-> postfix-expressionで...そしてpostfix-expressionのオブジェクト式タイプに依存します...メンバーテンプレート名の前にキーワードtemplateを付ける必要があります。..。


最初の部分: " "は、メンバーテンプレートの特殊化の名前であるthe name of a member template specializationために適用されます。operator()<int>これの証拠があります§14.2/1

テンプレートの特殊化は、 template-idで参照できます。

§14.2/1次に、に一致するtemplate-idの構文を指定しますoperator()<int>


2番目の部分: " "は、タイプに依存and the object expression of the _postfix-expression_ is type-dependentするため適用されます。次の理由でタイプに依存し ます:objobj§14.6.2.2/3

id式は、次のものが含まれている場合、型に依存します。-依存型で宣言された1つ以上の宣言に名前ルックアップによって関連付けられた識別子...

この場合、objはに関連付けられていますT&。これは依存型です(Tテンプレートパラメーターであるため)。


私が行った多くの主張についての参照を提供していないので、これは決定的な答えの半分にすぎません。でも、私はもう1時間ここにいるので、おそらくやめる時間です。

于 2011-10-06T14:47:02.867 に答える