тимплейты
От: Sergey Kirillov Ниоткуда  
Дата: 28.02.02 16:34
Оценка:
Всем привет.

ДАНО: Класс с функцией шаблоном внутри:
class A {
public :
template <class T> T * f(int pos) {...};

};

ВОПРОС: Как инcтанциировать функцию f c нужными мне параметрами шаблона?

ДОП.ИНФО: Для функций вне класса все делается очень просто:
template<class T> T * void f(int) {...};
void g(int j) {
int *fdf = f<int>(j);
}

однако в моем варианте
void g(int j) {
A a;

int *fdf = a.f<int>(j);
}

ЧТО ДЕЛАТЬ ?!!!
Re: тимплейты
От: TepMuHyc  
Дата: 28.02.02 16:43
Оценка: 5 (2)
Здравствуйте Sergey Kirillov, Вы писали:

SK> int *fdf = a.f<int>(j);

Подозреваю что ты это пытаешься собрать при помощи Visual C++ 6.0
Зря пытаешься. Не получится. Т.к. явному указанию типов в шаблонных
функциях VC отностися крайне болезненно и непредсказуемо.

Попытайся переписать это так чтобы компилятор сам мог вычислить
типа параметров в шаблонной функции. Например так:
template<class T> void f(int x, T **y);

int *fdf;
a.f<int>(j, &fdf);


SK>ЧТО ДЕЛАТЬ ?!!!

Так не делать. Или застрелиться. Или повеситься.
Или обругать гребаный мелкософт который вот уже пять лет не может
выпустить нормальный компайлер.
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re[2]: тимплейты
От: Sergey Kirillov Ниоткуда  
Дата: 28.02.02 16:59
Оценка:
Здравствуйте TepMuHyc, Вы писали:

SK>> int *fdf = a.f<int>(j);

TMH>Подозреваю что ты это пытаешься собрать при помощи Visual C++ 6.0
TMH>Зря пытаешься. Не получится. Т.к. явному указанию типов в шаблонных
TMH>функциях VC отностися крайне болезненно и непредсказуемо.
Честно говоря я к этому уже и сам дошел. В gcc все компилится на ура.

TMH>Попытайся переписать это так чтобы компилятор сам мог вычислить

TMH>типа параметров в шаблонной функции. Например так:
SK>>ЧТО ДЕЛАТЬ ?!!!
TMH>Так не делать. Или застрелиться. Или повеситься.
TMH>Или обругать гребаный мелкософт который вот уже пять лет не может
TMH>выпустить нормальный компайлер.
А накакие сервиспаки это дело не правят ?
Весь прикол в том что эта функция лежит в либе которую народ писал именно под MSVC.
Полный 3.14здец.
Re[3]: тимплейты
От: Sashko Россия http://www.dc.baika.ru/
Дата: 01.03.02 03:52
Оценка:
Здравствуйте Sergey Kirillov, Вы писали:

SK>А накакие сервиспаки это дело не правят ?

SK>Весь прикол в том что эта функция лежит в либе которую народ писал именно под MSVC.

Лежит да лежит себе. А вот пользовались ли они этой функцией? VC6 плохо понимает что такое

obj.Func<Type>();


точнее вообще ни понимаeт. И о чудо в 7.0 код

class CBar
{
public:
    template <class T> T Func()
    {
        return (T)getchar();
    }
};

// ...

    CBar bar;
    bar.Func<int>();


работает.

SK>Полный 3.14здец.


Труден хлеб программиста .
Re: тимплейты
От: User99  
Дата: 01.03.02 08:07
Оценка:
Здравствуйте Sergey Kirillov, Вы писали:

SK>Всем привет.


SK>ДАНО: Класс с функцией шаблоном внутри:

SK>class A {
SK>public :
SK> template <class T> T * f(int pos) {...};

SK>};


SK>ВОПРОС: Как инcтанциировать функцию f c нужными мне параметрами шаблона?


SK>ДОП.ИНФО: Для функций вне класса все делается очень просто:

SK>template<class T> T * void f(int) {...};
SK>void g(int j) {
SK> int *fdf = f<int>(j);
SK>}

SK>однако в моем варианте

SK>void g(int j) {
SK> A a;

SK> int *fdf = a.f<int>(j);

SK>}

SK>ЧТО ДЕЛАТЬ ?!!!

Может проще привести функции к виду:


class A
{
public:
    template<class _T> _T* f(const _T t)
    {
        _T* pt= new(_T);//а то, что параметр t не нужен - нечего страшного
        *pt=61;
        return pt;
    }
};

int main(int argc, char* argv[])
{
    A a;
    int* i;
    i=a.f(int());
    char* ch;
    ch=a.f( char() );
    return 0;
}

Или я чего-то не понимаю?
Re[2]: тимплейты
От: User99  
Дата: 01.03.02 08:09
Оценка:
Здравствуйте All
вместо template<class _T> _T* f(const _T t) хотел template<class _T> _T* f(const _T& t)
Re[3]: тимплейты
От: Кодт Россия  
Дата: 01.03.02 09:53
Оценка: 4 (2)
Здравствуйте All

Эта трабла недавно обсуждалась,
пришли к чуть более красивому решению: задающий тип параметр делать дефолтным:

template<class _T>result_t Func(/* нужные параметры */ , const _T* dummy = NULL);

Func<int>(...)
Func<float>(...)

вместо Func(..., int()), Func(..., float())
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.