下面的代码片段演示了我想要实现的目标,即创建两个模板特化(嗯,这里是一个主模板和一个特化),一个用于非常量成员函数,一个用于 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)()>
^