üye işlev işaretçi türleri dönüş türüne göre 'özel' sınıf şablonu, uzmanlaşmış girişiminde aşağıdaki kod, VC9 bir derleme hata ile sonuçlanır:Sınıf şablonu kısmi uzmanlık elemanı işlev dönüş tipine parametrize
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;
}
hata C2752: 'özel': http://ideone.com/ekWGg
: birden fazla kısmi uzmanlık ile gösterildiği gibi aynı kod GCC-4.3.4 tarafından kabul edilir
şablon bağımsız değişken bir liste ile karşılaştırılırBu VC9'da bir hata mı ve eğer öyleyse, bu hata VC10'un içinde kalmıştır?
Ben ancak (., En azından daha genel çözümler hoşgeldin bu özel kullanım durumu için) bir korkunç şekilde müdahaleci bir çözüm ile geldi:
#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> {};
bu hayal sınıfını örnekler şablon uzmanlık daha özelleşmiş olan fonksiyon şablon 4. Ve sınıf şablonu uzmanlık daha özelleşmiş olan Çünkü, R'nin “void” olma durumu çözülürken, her iki özelliğin de imzaları aslında aynıdır… 'typename' anahtar sözcüğünün akıllıca kullanımı bazı faydalar sağlayabilir ama şu an zeki bir şey düşünemiyorum. – AJG85