2012-11-12 41 views
5

這是完整的錯誤消息:如何解決C++編譯器錯誤「無法將'Type'轉換爲'const Type *'」?

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

這是我的代碼:

#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; 

} 

有什麼辦法,我可以修復?請隨時指出您看到的其他任何錯誤。我知道如何修復DetermineTimeElapsed來正確輸出hr:min:sec格式。但現在我需要通過這個。

+1

DetermineElapsedTime(tm,tm2);期待指針 – Sarang

+0

嗯。好的我明白了。所以我改變了DetermineElapsedTime(tm,tm2);要確定已經過去的時間(&tm,&tm2);無論如何誰投了票,這個問題有什麼問題? – user1781382

+1

@ user1781382完美的問題沒有任何解釋就被投下來,你的問題看起來比我的平均水平要好。問題標題?這不是主要問題,對於SO至少是 – john

回答

7

誤差應在以下行:

DetermineElapsedTime(tm, tm2); 

你傳入MyTime對象上述功能時,它預計const MyTime*

修復它由兩種傳遞對象地址:

DetermineElapsedTime(&tm, &tm2); 

或者更好的C++方式:通過改變函數原型接受對象引用:

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

身體也將隨之改變;例如->將被.運營商等取代。

2

函數期望一個指向2個變量的指針,但是你自己傳遞了這些變量,那就是問題所在。您通過只是路過使用&運營商自己的內存地址傳遞一個指針變量解決這個問題如下圖所示

DetermineElapsedTime(&tm, &tm2); 

或者你可以改變功能@iammilind暗示,這意味着接收到的變量的引用你可以保持原來的狀態。這將是一種更安全,更清潔的「C++」方式。

+0

沒錯,我看到第一條評論後就明白了,謝謝 – user1781382

1

您的功能DetermineElapsedTime需要指向MyTime的指針。

你的代碼更改爲:

DetermineElapsedTime(&tm, &tm2); 

&運營商在這方面的意思是 「獲取地址」

1

你的功能可按需要採取兩種常量指針:

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

現在,這裏是你如何稱呼它:

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

正如你所看到的,你正在通過值來傳遞變量,而不是像函數所期望的那樣通過指針傳遞它們。您可以修復它在幾個方面:

  • 變化的函數期望const引用:

    int DetermineElapsedTime(const MyTime &t1, const MyTime &t2) 
    
  • 採取正在傳遞的變量的地址:

    MyTime tm, tm2; 
    DetermineElapsedTime(&tm, &tm2); 
    
  • 動態分配東西並通過指針:

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

明白了謝謝 – user1781382

+0

動態分配可能是一種矯枉過正這樣的問題。 – iammilind

相關問題