2012-11-12 2 views
5

Questo è il messaggio di errore completo:Come risolvere compilatore C++-errore "non è in grado di convertire 'Tipo' a 'tipo const *'"?

error: cannot convert 'MyTime' to 'const MyTime*' for argument '1' to 'int DetermineElapsedTime(const MyTime*, const MyTime*)'|

E questo è il mio codice:

#include <iostream> 
#include<cstdlib> 
#include<cstring> 

using namespace std; 
struct MyTime { int hours, minutes, seconds; }; 
int DetermineElapsedTime(const MyTime *t1, const MyTime *t2); 
const int hourSeconds = 3600; 
const int minSeconds = 60; 

int DetermineElapsedTime(const MyTime *t1, const MyTime *t2) 
{ 
    long timeDiff = ((((t2->hours * hourSeconds) + (t2->minutes * minSeconds) + t2->seconds) - 
        ((t1->hours * hourSeconds) + (t1->minutes * minSeconds) + t1->seconds))); 
    return(timeDiff); 
} 


int main(void) 
{ 
    char delim1, delim2; 
    MyTime tm, tm2; 
    cout << "Input two formats for the time. Separate each with a space. Ex: hr:min:sec\n"; 
    cin >> tm.hours >> delim1 >> tm.minutes >> delim2 >> tm.seconds; 
    cin >> tm2.hours >> delim1 >> tm2.minutes >> delim2 >> tm2.seconds; 

    DetermineElapsedTime(tm, tm2); 

    return 0; 

} 

Esiste un modo che posso risolvere? Sentiti libero di segnalare eventuali altri errori che vedi. So di correggere DetermineTimeElapsed per produrre correttamente il formato hr: min: sec. ma in questo momento ho bisogno di superare questo.

+1

DetermineElapsedTime (tm, tm2); aspetta puntatori – Sarang

+0

Hmm. Ok capisco. Così cambio DetermineElapsedTime (tm, tm2); DetermineElapsedTime (& tm, &tm2); Chi ha votato per difetto, che cosa c'è di sbagliato nella domanda? – user1781382

+1

@ user1781382 Le domande perfettamente buone vengono votate senza spiegazione per tutto il tempo.La tua domanda sembra migliore della media per me. Forse la nota di panico nella titolo della domanda? Questo non è un grosso problema, almeno per SO. – john

risposta

7

L'errore dovrebbe essere al di sotto della linea:

DetermineElapsedTime(tm, tm2); 

Si passa MyTime oggetti per la funzione di cui sopra, quando si aspetta const MyTime*.

Fix it da entrambi che passano gli indirizzi degli oggetti:

DetermineElapsedTime(&tm, &tm2); 

O meglio C modo ++: cambiando il prototipo di funzione di accettare i riferimenti agli oggetti:

int DetermineElapsedTime(const MyTime &t1, const MyTime &t2); 

anche il corpo cambierà di conseguenza ; per esempio. -> saranno sostituiti da . operatore e così via.

2

La funzione si aspetta un puntatore a 2 variabili, ma si sta passando le variabili stesse, questo è il problema. È risolvere questo passando un puntatore alle variabili da solo di passaggio i loro indirizzi di memoria che utilizzano l'operatore & come illustrato di seguito

DetermineElapsedTime(&tm, &tm2); 

In alternativa è possibile modificare la funzione di ricevere i riferimenti alle variabili come @iammilind suggerisce, il che significherebbe puoi lasciare la linea sopra come era. Questo sarebbe un modo più sicuro, più pulito di "C++".

+0

Giusto. L'ho preso dopo aver visto il primo commento grazie – user1781382

1

La funzione DetermineElapsedTime aspetta puntatori a MyTime.

modificare il codice per:

DetermineElapsedTime(&tm, &tm2); 

Il & operatore in questo contesto significa "ottenere l'indirizzo di"

1

vostro funciton ha bisogno di prendere due puntatori const:

int DetermineElapsedTime(const MyTime *t1, const MyTime *t2) 
         \_____one______/ \______two_____/ 

Ora , ecco come si sta chiamando è:

MyTime tm, tm2; 
DetermineElapsedTime(tm, tm2); 

Come vedete si sta passando le variabili per valore invece di trasmetterli da un puntatore in funzione si aspetterebbe.È possibile risolvere il problema in un paio di modi:

  • modificare la funzione di aspettarsi un riferimento const:

    int DetermineElapsedTime(const MyTime &t1, const MyTime &t2) 
    
  • prendere l'indirizzo delle variabili che vengono passati:

    MyTime tm, tm2; 
    DetermineElapsedTime(&tm, &tm2); 
    
  • allocare dinamicamente e passare i puntatori:

    MyTime *tm = new MyTime(); 
    MyTime *tm2 = new MyTime(); 
    DetermineElapsedTime(tm, tm2); 
    
+0

Ottenuto. Grazie – user1781382

+0

L'allocazione dinamica potrebbe essere un eccessivo tali problemi. – iammilind