次のコードは、クライアントの要件のために実装しようとしている機能の簡略化された最小限のバージョンです。
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と検索エンジンで説明を検索しましたが、決定に役立つ信頼できる情報源に出くわしていません.
これは適切なコーディング方法ではないことは理解していますが、クライアント コードの要件はやや独特であるため、これはクライアント コードに必要です。他のさまざまな代替手段も試しましたが、うまくいきません。