Перегрузка шаблонной функции в шаблонном классе
От: _nn_  
Дата: 11.02.05 17:36
Оценка:
Что-то не могу сообразить с синтаксисом:

Так работает :
struct a
{
    template<typename T>
    void f(T* p);
};

template<>
void a::f<char const>(char const* p)
{
}


А так нет :
template<typename A>
struct a
{
    template<typename T>
    void f(T* p);
};

template<typename A>
template<>
void a<A>::f<char const>(char const* p)
{
}


Подскажите как правильно сделать.

Спасибо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Перегрузка шаблонной функции в шаблонном классе
От: SergeSS  
Дата: 11.02.05 18:09
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Что-то не могу сообразить с синтаксисом:


А так не подходит?

template<typename A, typename T>
struct a
{
    void f(T* p);
};

template<typename A, typename T>
void a<A, T>::f(T* p)
{
}

a<int, char const> A;
A.f("aaa");
Re: Перегрузка шаблонной функции в шаблонном классе
От: korzhik Россия  
Дата: 11.02.05 18:11
Оценка: 2 (1)
Здравствуйте, _nn_, Вы писали:

_>А так нет :

__>template<typename A>
__>struct a
__>{
__>    template<typename T>
__>    void f(T* p);
__>};

__>template<typename A>
__>template<>
__>void a<A>::f<char const>(char const* p)
__>{
__>}


так нельзя так по стандарту (14.7.3 / 18)
а почему бы не использовать простую перегрузку
template<typename A>
struct a
{
    template<typename T>
    void f(T* p);

    void f(char const*);

};

template<typename A>
template<typename T>
void a<A>::f(T* p)
{
}

template<typename A>
void a<A>::f(char const* p)
{
}
Re: Перегрузка шаблонной функции в шаблонном классе
От: Кодт Россия  
Дата: 11.02.05 18:11
Оценка: 2 (1)
Здравствуйте, _nn_, Вы писали:

Зачем тебе такие страсти потребовались?!
В конце концов, можно же обойтись перегрузкой вместо специализации.

А если очень хочется, чтобы параметр шаблона функции был свободным (задаваемым через <>), а не выводимым из фактических аргументов, то на:
template<class T> struct t2t {};

template<class A>
struct a
{
  template<class F> int foo()
  { return foo_imp(t2t<F>()); }

  // перегрузка. F - связанный параметр
  template<class F> int foo_imp(t2t<F> _);
  int foo_imp(t2t<const char*> _);
};

template<class A>
template<class F>
int foo_imp(t2t<F> _) { ..... }

template<class A>
int foo_imp(t2t<const char*> _) { ..... }
Перекуём баги на фичи!
Re[2]: Перегрузка шаблонной функции в шаблонном классе
От: _nn_  
Дата: 11.02.05 18:26
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, _nn_, Вы писали:


_>>А так нет :

K>
__>>template<typename A>
__>>struct a
__>>{
__>>    template<typename T>
__>>    void f(T* p);
__>>};

__>>template<typename A>
__>>template<>
__>>void a<A>::f<char const>(char const* p)
__>>{
__>>}
K>


K>так нельзя так по стандарту (14.7.3 / 18)

Я так и подозревал...
K>а почему бы не использовать простую перегрузку
Искал более общий путь.
Т.е. чтобы можно было бы объявить в классе, а потом перегружать не изменяя объявление класса.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.