次のコード スニペットは、私が達成したいことを示しています。つまり、2 つのテンプレートの特殊化 (ここではメイン テンプレートと特殊化です) を作成します。1 つは非 const メンバー関数に使用され、もう 1 つは const メンバー関数に使用されます。
// instantiate for non-const member functions
template <typename C, void(C::*F)()>
struct A {};
// instantiate for const member functions
template <typename C, void(C::*F)() const>
struct A<C const, F> {};
struct foo
{
void bar() const {}
typedef A<foo const, &foo::bar> bar_type;
void baz() {}
typedef A<foo, &foo::baz> baz_type;
};
このコードは、gcc 4.7、Intel 13.0、および MSVC 2012 を使用すると正常にコンパイルされますが、Clang 3.3 または Comeau 4.3.10.1 を使用するとコンパイルに失敗します。私はClangが実際に正しいと信じています。
このコードを書き直して、標準に準拠させる (つまり、Clang でコンパイルする) にはどうすればよいですか?
コンパイルエラーは次のとおりです。
test_6.cpp:22:26: error: non-type template argument of type 'void (foo::*)() const' cannot be converted to a value of type 'void (const foo::*)()'
typedef A<foo const, &foo::bar> bar_type;
^~~~~~~~~
test_6.cpp:7:33: note: template parameter is declared here
template <typename C, void (C::*F)()>
^