0

这是我将 2 个 Duration 对象以格式添加在一起的方法(HH,MM,SS)

    inline ostream& operator<<(ostream& ostr, const Duration& d){
      return ostr << d.getHours() << ':' << d.getMinutes() << ':' << d.getSeconds();
    }

    Duration operator+ (const Duration& x, const Duration& y){
        if ( (x.getMinutes() + y.getMinutes() >= 60) && (x.getSeconds() + y.getSeconds() >= 60) ){
           Duration z( (x.getHours() + y.getHours() + 1), (x.getMinutes() + y.getMinutes() + 1 - 60), (x.getSeconds() + y.getSeconds() - 60) );
           return z;
        }
        else if (x.getSeconds() + y.getSeconds() >= 60){
           Duration z( (x.getHours() + y.getHours()), (x.getMinutes() + y.getMinutes() + 1), (x.getSeconds() + y.getSeconds() - 60) );
           return z;
        }
        else if (x.getMinutes() + y.getMinutes() >= 60){
           Duration z( (x.getHours() + y.getHours() + 1), (x.getMinutes() + y.getMinutes() - 60), (x.getSeconds() + y.getSeconds()) );
           return z;
        }
        else{
            Duration z( (x.getHours() + y.getHours()), (x.getMinutes() + y.getMinutes()), (x.getSeconds() + y.getSeconds()) );
            return z;
        }
    }

在我的主要方法中,我有:

  Duration dTest4 (01,25,15);
  Duration result = dTest4+dTest4;
  cout << result << endl;

不幸的是,当我运行程序时,我得到了这个错误:

  error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Duration const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVDuration@@@Z) referenced in function _wmain 1>C:\Users\...exe : fatal error LNK1120: 1 unresolved externals

我希望能够在单个实体中将两次相加。IE。小时加在一起,然后是分钟,然后是秒。因此if-else,当 2 组分钟超过一个小时的 60 分钟上限时要处理......

任何帮助,将不胜感激。

4

4 回答 4

2

问题出在此处:cout << result << endl; 您尚未定义std::ostream& operator<<用于将Duration对象写入 ostream 的重载版本。这样的事情应该这样做:

std::ostream& operator<<(std::ostream& os, const Duration& rhs)
{ 
os << "Hours: <" << hours_ << ">, ";  
os << "Minutes: <" << minutes_ << ">, "; 
os << "Seconds: <" << seconds_ << ">"; 
return os; 
}
于 2012-12-10T18:50:09.783 回答
1

我猜流插入器是在Duration类的源文件中定义的,而不是在标题中;这将解释未定义的引用,因为它是内联的。如果是这种情况,请将内联定义移动到标题中。

加法也有一个问题:如果分钟和秒都溢出会发生什么?第一条if语句将捕获分钟溢出并返回一个Duration其秒数超出范围的对象。在不考虑溢出的情况下创建新对象可能更简单,然后检查几秒钟的溢出,如有必要,处理它,然后检查几分钟的溢出,如有必要,处理它。现在您知道为什么大多数日期/时间库使用整数类型来存储经过纪元的秒数​​(或其他),而不是像这样分解细节。

于 2012-12-10T19:01:17.873 回答
0

您需要为 << 运算符创建方法。目前,cout 无法解析您的 Duration。

于 2012-12-10T18:50:00.773 回答
-1

问题在于这条线
cout << result << endl;

您试图在对象上使用 << 运算符,而您只重载了 + 运算符尝试: cout << result.getHours() << endl;

于 2012-12-10T18:52:19.163 回答