以下C++代码不MS的Visual Studio 2010编译:方法指针模板不编译
class Foo
{
public:
/// Provides the signature of the methods that can be given to addValueSetListener
template <typename TT>
struct ChangeHandler
{
typedef void (TT::* OnSetValueMethod)();
};
template <typename TT>
void bar_ok(TT*, void (TT::*)(), bool = false) {}
template <typename TT>
void bar_ok(const char*, TT*, void (TT::*)()) {}
template <typename TT>
void bar_fails(TT*, typename ChangeHandler<TT>::OnSetValueMethod, bool = false) {}
template <typename TT>
void bar_fails(const char*, TT*, typename ChangeHandler<TT>::OnSetValueMethod) {}
void testBar() {}
};
int main()
{
Foo foo;
foo.bar_ok ("allo",& foo, & Foo::testBar); // compiles
foo.bar_fails("allo",& foo, & Foo::testBar); // compile ERROR
}
编译器误差为'TT': must be a class or namespace when followed by '::'
,用于ERROR线。
失败的行和唯一不同的行之间的唯一区别是bar_fails通过“模板化typedef”声明“方法指针类型”参数void (TT::*)()
,而bar_ok直接声明它。
请注意,如果没有const char*
的超载,模板化的typedef可以正常工作。在const char *过载可用的情况下,编译器错误地选择了bar_fails的重载,但它正确地选择了bar_ok的TT = Foo重载。当typedef适用于像TT *或float *这样的“简单”数据时,不会出现此问题。
您标记为'// compiles'的行没有办法。所有这些成员都是“私人”的开始。你能告诉我们真实的代码吗? –
'main'也返回'int' ...(看起来是拼写错误) –
@PierreFourgeaud对不起,我修复了这个问题 – Schollii