以下代码尝试根据成员函数指针类型的返回类型专门化类模板“special”,导致 VC9 出现编译错误:
template<class F> struct special {};
template<class C> struct special<void(C::*)()> {};
template<class R, class C> struct special<R(C::*)()> {};
struct s {};
int main()
{
special<void(s::*)()> instance;
return 0;
}
错误 C2752:“特殊”:多个部分特化与模板参数列表匹配
GCC-4.3.4 接受相同的代码,如下所示:http://ideone.com/ekWGg
这是 VC9 中的错误,如果是,此错误是否持续存在于 VC10 中?
然而,我想出了一个非常侵入性的解决方法(至少对于这个特定的用例。欢迎更通用的解决方案):
#include <boost/function_types/result_type.hpp>
#include <boost/type_traits/is_same.hpp>
template<typename F, typename R>
struct is_result_same :
boost::is_same<
typename boost::function_types::result_type<F>::type,
R
>
{};
template<class F, bool = is_result_same<F, void>::value>
struct special {};
template<class R, class C> struct special<R(C::*)(), true> {};
template<class R, class C> struct special<R(C::*)(), false> {};