Newsgroup: it.comp.lang.c++
Titolo: Puntatore a funzione template membro di una classe

Salve a tutti,
ho un problema che sto cercando di risolvere.
Avevo una classe con due funzioni membro private ed una pubblica che
utilizzava un
puntatore a funzione membro:
// file C.h
#include <iostream>
class C
{
private:
    int f(int p1, int p2) {std::cout << "I am f" << p1 << p2 <<
std::endl;return p1 + p2;}
    int g(int p1, int p2) {std::cout << "I am g" << p1 << p2 <<
std::endl;return p1 - p2;}
public:
    void choice(int ch, int p1, int p2)
                                        int (C::*pf)(int, int);
                                        if (ch) pf = C::f;
                                        else    pf = C::g;
                                        (this->*pf)(p1, p2);}
};
// file C.cpp
#include "C.h"
int main()
{
    C cobj;
    cobj.choice(1, 10, 20);
    return 0;
}
e fin qua tutto va bene.
Il problema e´ che ora dovrei templarizzare le funzioni membro f e g della
classe C in questo modo e non so come modificare la funzione membro choice:
// file Ctemplate.h
#include <iostream>
class C
{
private:
   template<class T>
  T f(T p1, T p2) {std::cout << "I am f" << p1 << p2 << std::endl;return p1
+ p2;}
  template<class T>
  T g(T p1, T p2) {std::cout << "I am g" << p1 << p2 << std::endl;return
p1 - p2;}
public:
    void choice(int ch, int p1, int p2)
                                        int (C::*pf)(int, int);
                                        if (ch) pf = C::f;
                                        else    pf = C::g;
                                        (this->*pf)(p1, p2);}
}
// file Ctemplate.cpp
#include "Ctemplate.h"
int main()
{
    C cobj;
    cobj.choice(1, 10, 20);
    cobj.choice(1, 10.4, 20.5);
    return 0;
}
E qua ovviamente il compilatore mi da´ un errore nella funzione membro
choice che devo modificare per generalizzare il puntatore pf che ora non
punta piu´ a una funzione membro particolare ma generica.
Scusate se sono stato prolisso e grazie a chi mi illumina.
N.B.
Uso Ms VisualC++ 6 .0 e mi pare che abbia qualche bug sulle specializzazioni
di templates, se si volesse modificare in tal senso il programma.
Mauro

 
Questa dovrebbere essere la sintassi giusta, ammesso che io abbia capito
quello che vuoi ottenere:
 if (ch) pf = &C::f<int>;
 else    pf = &C::g<int>; 
Max


Anche choice deve essere template:
    template<class T>
    void choice(int ch, T p1, T p2)
    {
        T (C::*pf)(T, T);
        if (ch) pf = C::f;
        else    pf = C::g;
        (this->*pf)(p1, p2);
    }
Saluti  Manlio Perillo


Ciao Max,
avevo gia´ messo quella sintassi ma ecco cosa ottengo col compilatore
MSVisual C++ 6 :
class C
{
<snip>
    void choice(int ch, int p1, int p2)
                                        int (C::*pf)(int, int);
                                        if (ch) pf = &C::f<int>;
                                        else    pf = &C::g<int>;
                                        (this->*pf)(p1, p2);}
};
c:\mauro\fsu2000win32\analyse\analyse.h(59) : fatal error C1001: INTERNAL
COMPILER ERROR
        (compiler file 'msc1.cpp', line 1786)
         Please choose the Technical Support command on the Visual C++
         Help menu, or open the Technical Support help file for more
information
Error executing cl.exe.
Mauro


Ciao Manlio,
ho templarizzato anche choice come mi hai detto.
Fra parentesi ci siamo dimenticati di referenziare le funzioni C::f e C::g
nell徨ssegnamento al puntatore pf.
Comunque se non istanzio prima le funzioni ho ancora problemi:
class C
{
// snip
    void choice(int ch, T p1, T p2)
                                        f(1, 1); // devo istanziare f anche
se non voglio
                                        g(2, 2); // ed anche g
                                        T (C::*pf)(T, T);
                                        if (ch) pf = &C::f;
                                        else    pf = &C::g;
                                        (this->*pf)(p1, p2);}
};
Se non istanziassi f e g avrei problemi di compilazione quando nel file.cpp
nel main chiamo:
int main()
{
    C cobj;
    cobj.choice(i, 10, 20);
    return 0;
}
c:\mauro\fsu2000win32\analyse\analyse.h(62) : error C2563: mismatch in
formal parameter list
        c:\mauro\fsu2000win32\analyse\analyse.cpp(531) : see reference to
function template instantiation 'void __thiscall C::choice(int,int,int)'
being compiled
c:\mauro\fsu2000win32\analyse\analyse.h(63) : error C2563: mismatch in
formal parameter list
        c:\mauro\fsu2000win32\analyse\analyse.cpp(531) : see reference to
function template instantiation 'void __thiscall C::choice(int,int,int)'
being compiled
Error executing cl.exe.
Mauro


Questo č un problema del tuo compilatore.
Ho compilato il codice con il BCC 5.5 ed il DJGPP e non ci sono problemi.
Saluti  Manlio Perillo