如何修复C++编译器错误"cannot convert 'Type' to 'const Type*'"?

How to fix C++ compiler-error "cannot convert 'Type' to 'const Type*'"?

本文关键字:Type to const convert C++ 何修复 编译器 错误 cannot      更新时间:2023-10-16

这是完整的错误消息:

错误:无法将参数"1"的"MyTime"转换为"const MyTime*"到"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:secn";
    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格式。但现在我需要克服这一点。

错误应该在下面一行:

DetermineElapsedTime(tm, tm2);

当您MyTime对象需要const MyTime*时,您将对象传递给上述函数。

通过传递对象地址来修复它:

DetermineElapsedTime(&tm, &tm2);

或者更好的C++方法:通过更改函数原型以接受对象引用:

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

身体也会相应地改变;例如 ->将由.运算符等替换。

该函数期望指向 2 个变量的指针,但您正在传递变量本身,这就是问题所在。您可以通过使用 & 运算符传递变量的内存地址来传递指向变量的指针来解决此问题,如下所示

DetermineElapsedTime(&tm, &tm2);

或者,您可以更改函数以接收对变量的引用,如@iammilind建议的那样,这意味着您可以保持上面的行不变。这将是一种更安全、更清洁、更"C++"的方式。

您的函数DetermineElapsedTime需要指向MyTime的指针。

将代码更改为:

DetermineElapsedTime(&tm, &tm2);

在此上下文中,&运算符表示"获取地址"

你的函数需要采用两个常量指针:

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

现在,这是您如何称呼它:

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

如您所见,您是按值传递变量,而不是像函数所期望的那样通过指针传递它们。您可以通过几种方式修复它:

  • 将函数更改为需要常量引用:

    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);
    
相关文章: