【问题标题】:C++ incomprehensible compiler errorsC++ 无法理解的编译器错误
【发布时间】:2013-03-31 09:50:20
【问题描述】:

我有一个非常简单的任务要做。编写一个定义时间的类。出于某种原因,在其中一个函数中出现了一个我不理解的错误。
我搜索了一个没有成功的解决方案,所以最后我决定在这里发布。

时间.h

class time
{
private:
    int _hours;
    int _minutes;
    float _seconds;
    bool checkHours(int hours);
    bool checkMinutes(int minutes);
    bool checkSeconds(float seconds);

public:

time(int hours=0, int minutes=0, float seconds=0);
time(const time & tm);
~time();


void hours(int hours);
int  hours() const;
void minutes(int minutes);
int  minutes() const;
void seconds(float seconds);
float  seconds() const;


void operator=(time tm);
bool operator==(time tm);


void print();
time getTimeFromUser();
float getTimeAsFractionOfTheDay(time tm);

};

time.cpp

#include <iostream>
#include "time.h"

bool time::checkHours(int hours)
{
    return hours>=0 && hours<24;
}
bool time::checkMinutes(int MS)
{
    return MS>=0 && MS<60;
}
bool time::checkSeconds(float MS)
{
    return MS>=0 && MS<60;
}

//constractors
time::time(int hours, int minutes, float seconds)
{
    if(checkHours(hours) && checkMinutes(minutes) && checkSeconds(seconds))
    {
        _hours=hours;
        _minutes=minutes;
        _seconds=seconds;
    }
    else
    {
        cout<<"Error"<<endl; _hours=-1; _minutes=-1; _seconds=-1;
    }
}
time::time(const time & tm)
{
    _seconds = tm.seconds();
    _hours = tm.hours();
    _minutes=tm.minutes();
}
time::~time()
{
}

//get-set functions
void time::hours(int hours)
{
    _hours=hours;
}
int  time::hours() const
{
    return _hours;
}
void time::minutes(int minutes)
{
    _minutes=minutes;
}
int  time::minutes() const
{
    return _minutes;
}
void time::seconds(float seconds)
{
    _seconds = seconds;
}

float  time::seconds() const
{
    return _seconds;
}

//operators
void time::operator=(time tm)
{

    _hours=tm.hours();
    _minutes=tm.minutes();
    _seconds=tm.seconds();

}
bool time::operator==(time tm)
{
    return _hours=tm.hours() && _minutes==tm.minutes() && _seconds==tm.seconds();
}

//some function
void time::print()
{
    cout<<" "<<_hours<<":"<<_minutes<<":"<<_seconds<<" "<<endl;
}

time time::getTimeFromUser()
{
    time newTime;
    int userhours=-1;
    int userminutes=-1;
    float userseconds=-1;
    while (!checkHours(userhours))
    {
        cout<<"enter hours"<<endl;
        cin>>userhours;
        if(!checkHours(userhours))
        {
            cout<<"Error try again"<<endl;
        }
    }

    while (!checkMinutes(userminutes))
    {
        cout<<"enter minutes"<<endl;
        cin>>userminutes;
        if(!checkMinutes(userminutes))
        {
            cout<<"Error try again"<<endl;
        }
    }

    while (!checkSeconds(userseconds))
    {
        cout<<"enter Seconds"<<endl;
        cin>>userseconds;
        if(!checkSeconds(userseconds))
        {
            cout<<"Error try again"<<endl;
        }
    }

    newTime.seconds(userseconds);
    newTime.hours(userhours);
    newTime.minutes(userminutes);

    return newTime;
}


float time::getTimeAsFractionOfTheDay(time tm)
{

    return 0.0;
}

我得到了这些错误

我不明白我做错了什么。我认为这很愚蠢,但我找不到。

【问题讨论】:

  • 顺便说一句,你有一个微妙的错误:return _hours=tm.hours() &amp;&amp;
  • 错误清楚地表明 time 不是类型 - 因此在 time time::getTimeFromUser() 中造成麻烦。在class time {};的整个声明之前添加class time;

标签: c++ compiler-errors


【解决方案1】:

事实证明,您是一个微妙错误的受害者。

time 是一个在系统头文件time.h 中声明的函数,它通过iostream 包含在您的程序中。当你声明time time::getTimeFromUser()时,编译器看到返回值并认为你的意思是函数时间!

clang 的错误使这一点显而易见:

time.cpp:122:1: error: must use 'class' tag to refer to type 'time' in this scope
time time::getTimeFromUser()
^
class 
/usr/include/time.h:133:8: note: class 'time' is hidden by a non-type declaration of 'time' here
time_t time(time_t *);
       ^

解决方法是像这样定义特定的函数:

class time time::getTimeFromUser() {
    ...
}

或者,如果使用 C++11,

auto time::getTimeFromUser() -> time {
    ...
}

【讨论】:

    【解决方案2】:

    第一个问题:

    bool time::operator==(time tm)
    {
        return _hours=tm.hours() && _minutes==tm.minutes() && _seconds==tm.seconds();
    //               ^
    }
    

    那里应该有一个比较运算符,而不是一个赋值:

    bool time::operator==(time tm)
    {
        return _hours==tm.hours()
    //               ^^
                       && _minutes==tm.minutes() && _seconds==tm.seconds();
    }
    

    第二个问题:

    您正在使用属于std 命名空间的coutendl,没有using 声明或using 指令。

    您应该在使用coutcinendl 作为非限定名称之前添加以下内容:

    using std::cout;
    using std::endl;
    using std::cin;
    

    或者,您可以选择在使用它们时完全限定它们的名称。例如:

        std::cout<<"Error"<<endl; _hours=-1; _minutes=-1; _seconds=-1;
    //  ^^^^^
    

    【讨论】:

    • 虽然这些是错误,最好指出它们,但它们都不是导致 OP 提到的编译错误的原因。
    • +1 用于指出否则会被忽略的错误。
    • @AlokSave:你说得对,在我弄明白之前我不得不离开,所以……我的错 :)
    【解决方案3】:

    问题在于您的标头是 time.h(已作为标准标头)。 你认为你得到了你声明的那个,但你得到了标准的那个。 因此,您没有类的声明,而是标准标题。 将其重命名为 Test.h 和 Tes.cpp 即可 并在你的 cpp 文件顶部添加 using namespace std

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2022-11-13
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多