【问题标题】:How to fix C++ compiler-error "cannot convert 'Type' to 'const Type*'"?如何修复 C++ 编译器错误“无法将 'Type' 转换为 'const Type*'”?
【发布时间】:2012-11-12 06:31:31
【问题描述】:

这是完整的错误信息:

错误:无法将参数 '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: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;

}

有什么办法可以解决吗?请随时指出您看到的任何其他错误。我确实知道修复确定时间以正确输出 hr:min:sec 格式。但现在我需要克服这个问题。

【问题讨论】:

  • DetermineElapsedTime(tm, tm2);期望指针
  • 嗯。好的我明白了。所以我改变了DetermineElapsedTime(tm, tm2);确定ElapsedTime(&tm, &tm2);无论如何,谁反对投票,这个问题有什么问题?
  • @user1781382 非常好的问题总是在没有任何解释的情况下被否决。你的问题在我看来比平均水平要好。也许问题标题中的恐慌说明?这不是主要问题,至少对于 SO 而言。
  • 谢谢你讲道理。

标签: c++ pointers constructor compiler-errors


【解决方案1】:

错误应该在下面一行:

DetermineElapsedTime(tm, tm2);

您将MyTime 对象传递给上述函数,而它需要const MyTime*

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

DetermineElapsedTime(&tm, &tm2);

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

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

身体也会随之改变;例如-&gt; 将替换为 . 运算符等等。

【讨论】:

    【解决方案2】:

    该函数需要一个指向 2 个变量的指针,但您自己传递变量,这就是问题所在。您可以通过使用&amp; 运算符传递指向变量的指针来解决此问题,如下所示

    DetermineElapsedTime(&tm, &tm2);
    

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

    【讨论】:

      【解决方案3】:

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

      将您的代码更改为:

      DetermineElapsedTime(&tm, &tm2);
      

      &amp; 运算符在此上下文中的意思是“获取地址”

      【讨论】:

        【解决方案4】:

        你的函数需要两个 const 指针:

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

        【讨论】:

        • 动态分配对于此类问题可能是一种矫枉过正。
        猜你喜欢
        • 2020-08-14
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多