0

次のコードは、クライアントの要件のために実装しようとしている機能の簡略化された最小限のバージョンです。

IBM の XLC コンパイラ (バージョン 9 と 11 の両方) でのコンパイルに失敗し、エラーが発生しますA non-type template parameter cannot have type "int X::*".。ただし、g++ 4.7.2、clang++ 3.2、および Intel-13.0 で同じコードを試したところ、正常にコンパイルされました。

ここで XLC が唯一の正気な音声なのか、それとも他のコンパイラが正しいのか知りたいです。

struct X {
    X() : y(123) {}
    int y;
};

struct XFoo {
   typedef int X::* Type;
};

template <typename Name, typename Name::Type value>
struct Bar {
    typename Name::Type getValue(Name) {
        return value;
    }
};

template class Bar<XFoo, &X::y>;    // xlc error here, works fine on others

int main() {}

<type> <class>::*テンプレートに関する C++ 2003 標準の章を何度か読みましたが、非テンプレート型としての使用を禁止するものを最終的に見つけることができませんでした。私はすでにSOと検索エンジンで説明を検索しましたが、決定に役立つ信頼できる情報源に出くわしていません.

これは適切なコーディング方法ではないことは理解していますが、クライアント コードの要件はやや独特であるため、これはクライアント コードに必要です。他のさまざまな代替手段も試しましたが、うまくいきません。

4

2 に答える 2

1

§C++03標準の14.1/4では、テンプレートパラメータとしてメンバーへのポインタを使用できます。

非型テンプレートパラメータは、次の(オプションでcv修飾された)型のいずれかを持つ必要があります。

  • 整数型または列挙型、
  • オブジェクトへのポインタまたは関数へのポインタ、
  • オブジェクトへの参照または関数への参照、
  • メンバーへのポインタ

同様に、§14.3.2/ 1に従って:

非型、非テンプレートのテンプレートパラメータのテンプレート引数は、次のいずれかである必要があります

  • 積分定数-積分型または列挙型の式。また
  • 非型テンプレートパラメータの名前。また
  • 関数テンプレートおよび関数テンプレートIDを含むが、非静的クラスメンバーを除く、外部リンケージを持つオブジェクトまたは関数のアドレス。&id-expressionとして表されます。名前が関数または配列を参照する場合、または対応するtemplate-parameterは参照です。また
  • 5.3.1で説明されているように表現されたメンバーへのポインタ

したがって、型以外のテンプレートパラメータは、メンバーへのポインタになる可能性があります。テンプレートの特殊化に適用されるいくつかの制限がありますが、この場合は適用されないようです。

于 2013-02-04T17:19:34.030 に答える
1

メンバーへのポインター テンプレート パラメーターは明示的に許可されており、XLC にはバグ レポートを提供する必要があります。

于 2013-02-04T17:19:16.767 に答える