Здравствуйте, Undead, Вы писали:
U>U>template <typename T>
U>struct Formatter
U>{
U>};
U>template <typename T>
U>struct MemberFunction
U>{
U> typedef void(T::*Type)(void);
U>};
U>template <typename T>
U>struct Formatter<typename MemberFunction<T>::Type >
U>{
U>/*...*/
U>};
U>int main()
U>{
U>}
U>
U>VC 7.1 не компилит:
U>error C2764: 'T' : template parameter not used in partial specialization 'Formatter<MemberFunction<T>::Type>'
U>Как правильно записать то, что имелось ввиду?
Если не использовать обертки вроде MemberFunction, то по-моему так:
template <typename T>
struct Formatter
{
};
template <class T, typename R, typename A>
struct Formatter<R (T::*)(A)>
{
};
Но мой компилятор(BCB6) на такое ругается, хотя такое:
template <typename R, typename A>
struct Formatter<R (*)(A)>
{
};
воспринимает OK.
Когда я столкнулся с этой проблемой, я как раз и использовал обертку типа MemberFunction:
template <class T, typename R, typename A>
struct MemberFunction
{
typedef R (T::*Type)(A);
};
На специализацию Formatter'а типом MemberFunction<T,R,A>::Type BCB6 тоже ругается,
поэтому я специализировал его типом обертки,
а уже внутри можно обращаться к MemberFunction<T, R, A>::Type:
template <class T, typename R, typename A>
struct Formatter< MemberFunction<T, R, A> >
{
static void f() { std::cout << typeid(MemberFunction<T, R, A>::Type).name(); }
};
struct Foo;
int main(int argc, char* argv[])
{
Formatter< MemberFunction<Foo, int, double> >::f();
std::cin.get();
return 0;
}
Вроде, работало OK.