C ++期望'&'之前的构造函数,析构函数或类型转换代币

时间:2012-06-26 03:05:01

标签: c++ compiler-errors

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

这是fixed.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

这是fixed.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;}

3 个答案:

答案 0 :(得分:4)

您的代码存在很多问题。主要问题如下:

fixednamespace std的成员;您在代码中声明了相同的名称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等同于

答案 1 :(得分: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)
  ^

答案 2 :(得分:2)

这是一个典型的例子,说明为什么你不应该使用using namespace std;,你通过在同一个命名空间中使用相同的标识符来引起称为命名空间污染的东西(因为所有来自std的东西都被拉入)。

首先,只有当std需要时,才会引入using std::something;命名空间的部分内容。或者更好的是,学会欣赏std::,当你在C ++生活和呼吸其标准库时,它将使你的生活变得更加轻松。

其次,考虑到样式时,很多代码都是灾难性的,更不用说坏的做法了。你介绍的内容如下:

fixed& operator+=(fixed other);

这有很多问题,但最突出的问题是缺少constness,事实上你实际上是通过值传递类的实例,调用复制构造函数并进行不必要的复制。您需要使用const的原因更多的是程序员的安全问题和良好做法。你看,你只需要读取传入的值来制定一个答案,即操作员的回报。因此,使其不可变使您可以安全地计算结果并将其返回。

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

当您删除using namespace std;或完全更改班级名称时,您的初始问题将会消失。但是你的运算符重载有很多问题。具体来说,您如何接受参数,如何返回参数以及管理情境以仅执行实际需要执行的操作(避免不必要的副本和临时工具)。