PDA

View Full Version : [C++] Visual Studio 10 non compila perchè non vede l'overloading??


vendettaaaaa
08-06-2012, 22:27
Help :D
Sto cercando di compilare un programma che fa uso di alcune librerie esterne. Praticamente, ricevo errore qui:
void DaeSolver(BzzVectorInt& iDer, const BzzVector& relTol, const BzzVector& absTol, BzzVector& yMin, BzzVector& yMax,
const double& t0, const double& tOut, const double& tCritic, int& iState, BzzVector& y0)
{
int nEq = y0.Size();

// Initialize the output array
BzzVector y(nEq);

// Initialization of the Dae System object
BzzDae o(y0, t0, iDer, DyByDt);

All'ultima riga, mi dice "error C2664: cannot convert parameter 3 from BzzVectorInt& to BzzMatrixSparse&". Cioè, il compilatore non vede il costruttore che voglio usare io, sebbene sia ben presente nell'hpp:
// ============================================================================
// *****************************< constructors >*******************************
// ============================================================================
BzzDae(void)
:BzzDaeStiffBase(){};

BzzDae(BzzVector &y00,double t00,BzzMatrix &AA,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f),
BzzMatrix &JJ);

BzzDae(BzzVector &y00,double t00,BzzMatrixSparse &AA,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f))
{
SetInitialConditions(y00,t00,AA,ptrSys);
}
void SetInitialConditions(BzzVector &y00,double t00,BzzMatrixSparse &AA,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f));
void operator()(BzzVector &y00,double t00,BzzMatrixSparse &AA,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f))
{
SetInitialConditions(y00,t00,AA,ptrSys);
}

BzzDae(BzzVector &y00,double t00,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f),
void (*ptrJac)(BzzVector &yy,double tt,BzzMatrix &JJ));


BzzDae(BzzVector &y00,double t00,BzzVectorInt &iDer,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f))
{
SetInitialConditions(y00,t00,iDer,ptrSys);
}
void SetInitialConditions(BzzVector &y00,double t00,BzzVectorInt &iDer,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f));
void operator()(BzzVector &y00,double t00,BzzVectorInt &iDer,
void (*ptrSys)(BzzVector &y,double t,BzzVector &f))
{
SetInitialConditions(y00,t00,iDer,ptrSys);
}

Evidenziato in rosso quello che il compilatore vede, in blu quello che voglio usare io.
Perchè??? :muro:

vendettaaaaa
08-06-2012, 23:58
Ho trovato il problema, anche se il compilatore cmq ha mandato un messaggio poco chiaro.
La funzione voluta dai costruttori è
void (*ptrFunc)(BzzVector& y, double t, BzzVector& dydt)
mentre la mia DyByDt era
void DyByDt(BzzVector& y, const double& t, BzzVector& dydt)
Avevo usato una const reference come 2° paramentro perchè so che t non viene modificato (ho scritto io DyByDt). Dal punto di vista pratico non dovrebbe cambiare nulla, allora come mai questa rigidità? Il constructor vuole una funzione che prenda un double by value, io gli do una const reference: in ogni caso il valore passato non viene toccato...mah?

marco.r
10-06-2012, 13:56
a naso direi perche' un costruttore accetta 4 argomenti, l'altro 5 (in altri termini, stai passando un parametro di troppo).