Re: Инстанциирование в шаблонном параметре
От: ReV01VeR  
Дата: 28.12.04 04:41
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.