-1

当我执行运算符重载时,我在'&'token 之前得到了这个错误,预期构造函数、析构函数或类型转换。错误发生在 fixed.cpp 的最后 8 行中,我不确定我错过了什么。任何帮助表示赞赏。

这是固定的.hpp

    #ifndef FIXED_HPP_
    #define FIXED_HPP_

    typedef float value_type ;  

    class fixed
    {
     public:
       fixed();
       fixed(value_type integer, value_type fraction); 
       fixed(double val);
       void as_string();
       value_type integer();
       value_type fraction();
       value_type value();
       //~fixed();
       fixed& operator+=(fixed other);

       static const int places=4;   
       static const int places10=10000;  

     private:
       value_type integer_;
       value_type fraction_;   
       value_type value_;
    };

    fixed operator+(fixed a, fixed b);

    #endif

这是固定的.cpp:

    #include "fixed.hpp"

    #include <iostream>
    #include <ostream>
    #include <stdexcept>
    #include <string>
    #include <algorithm>


    using namespace std;

    fixed::fixed():integer_(0), fraction_(0), value_(0){}

    fixed::fixed(value_type integer,  value_type                 fraction):integer_(integer),         fraction_(fraction) 
           {try
       {
        if (fraction_ <0)                          
           throw invalid_argument("Invalid argument. Must be positive.");
       }
            catch (exception& e)
              {
                cout <<"\n"<< e.what() << std::endl;
      }
             while (fraction_>= places10)
                {
                 if(int(fraction_)%10 >=5 && fraction_< (places10*10) )
            fraction_=int(fraction_/10+1);               
         else
            fraction_ =int(fraction_/10);
        }

     value_ = integer_*places10 + fraction_;  
           } 

    fixed::fixed(double val):integer_(int (val)), fraction_( (val- int(val))*places10) 
           { if (val <0)
                {    val = val*(-1);
             if ( int(val*places10*10)%10>=5)
              fraction_ = (fraction_*(-1) +1)*(-1);
        }     
     else
         {
          if (int(val*places10*10)%10>=5)
              fraction_ = fraction_ +1;
         }

     value_ = integer_*places10 + fraction_;  
           }

    void fixed::as_string()
           {    string str;
                string str2;
        while( (int(integer_)/10) >=0 and int(integer_)>0 )
             {
             str.push_back(int(integer_)%10 + 48);
             integer_ = integer_/10;
             //cout<<str<<endl;
             }
        //cout<<"String format: "<<str<<endl;
        reverse(str.begin(), str.end());
        //cout<<"Reversed format: "<<str<<endl;
        str.push_back('.');
        //cout<<"New string: "<<str<<endl;
        while( (int(fraction_)/10 )>=0 and int(fraction_)>0)
             {
             str2.push_back(int(fraction_)%10 + 48);
             fraction_ = fraction_/10;
             //cout<<str<<endl;
             }
        //cout<<"String format: "<<str<<endl;
        reverse(str2.begin(), str2.end());
        str.append(str2);
        cout<<"String representation: "<<str<<endl;
           }   

    value_type fixed::value()
         {
          return   value_;     
         }
    value_type fixed::integer()
         {
          return integer_;
         }
    value_type fixed::fraction()
                {
          return fraction_;
         }
    fixed& fixed::operator+=(fixed other) // error
           { value_ += other.value();
             return *this;     
           }

    fixed operator+(fixed a, fixed b)  //error
          { a+=b;
          return a;}
4

3 回答 3

4

你的代码有很多问题。主要问题如下:

fixednamespacestd 的成员;您正在声明相同的名称并在您的代码中class有一个邪恶。using namespace std;

其他几点:

  1. 始终,不要 using namespace std在全球范围内进行练习。如果需要,请放置std::前缀或放在using函数范围内。
  2. fixed::operator+=(Fixed), 应该是fixed::operator+=(const Fixed&); 否则会造成不必要的复制。
  3. 上面的评论也是正确的operator+(fixed a, fixed b),而且确实如此a += b,这是错误的。它应该是a + b等价的
于 2012-06-26T03:17:59.683 回答
2

Clang 提供了以下错误,这应该使正在发生的事情更加明显:

fixed.cpp:90:1: error: reference to 'fixed' is ambiguous
fixed& fixed::operator+=(fixed other) // error
^
./fixed.hpp:6:11: note: candidate found by name lookup is 'fixed'
    class fixed
          ^
/usr/include/c++/4.2.1/bits/ios_base.h:950:3: note: candidate found by name lookup is 'std::fixed'
  fixed(ios_base& __base)
  ^
于 2012-06-26T03:20:02.357 回答
2

这是为什么不应该使用的经典示例,因为using namespace std;在同一个命名空间中具有相同的标识符(因为从 std 中提取了所有内容),您会导致称为命名空间污染的事情。

首先,std仅在需要时才拉入部分命名空间using std::something;。或者更好的是,学会欣赏 . std::,当您在 C++ 生活和呼吸其标准库的情况下变得更好时,它将使您的生活变得更加轻松。

其次,当考虑到风格时,你的很多代码都是灾难性的,更不用说糟糕的做法了。您正在介绍以下内容:

fixed& operator+=(fixed other);

这样做有很多问题,但最突出的问题是缺乏 const 性,事实上您实际上是按值传递类的实例,调用复制构造函数并进行不必要的重复。您需要使用的原因const更多是程序员的安全问题和良好实践。你看,你只需要读取传入的值来制定一个答案,一个运算符的返回。因此,使其不可变使您能够安全地计算结果并返回它。

fixed& operator+=(const fixed& other); // preferably call *other* rhs (righthandside)

当您using namespace std;完全删除或更改班级名称时,您最初的问题就会消失。但是您的运算符重载有很多问题。具体来说,你如何接受参数,如何返回它们以及管理情况以只做实际需要做的事情(避免不必要的副本和临时性)。

于 2012-06-26T03:32:33.263 回答