MyClass.h文件:
class CMyClass  
{
  public:
         CMyClass();
virtual ~CMyClass();
friend CMyClass operator+(long Dol, CMyClass Curr);
};
    
CMyClass operator+(long Dol, CMyClass Curr )//就是这个函数!
{
    return Curr;
}
MyClass.cpp文件:#include "MyClass.h"
CMyClass::CMyClass()
{}
CMyClass::~CMyClass()
{}
mainf文件:#include "MyClass.h"
void main(void)
{}
为简便起见,我省略了其它无关的东西,不过这样已经可以说明问题,大家可以试一试。

解决方案 »

  1.   

    很简单,头文件不会被编译,只有cpp文件才被编译。
      

  2.   

    .h参与了所有包含他的.cpp的编译,当然会报重复定义
    不要在.h中加入任何定义,.h是声明用的
      

  3.   

    原因是这样,
    如果 operator+ 放在 myclass.h文件中,在myclass.cpp中包含了myclass.h ,此是编译程序得到了一次operator+的定义 , 而在 mainf 中也包含了myclass.h,编译程序又得到了一次operator+的定义,而且这两个定义是完全一样的,所以编译程序无法正确编译。最好的方式如rchu所说。此外,在头文件中最好加入条件,避免此头文件在同一文件中被多次包含,因为多次声明也会导致出错。
    如:#ifndef _CMYCLASS_
    #define _CMYCLASS_class CMyClass  
    {
      public:
            CMyClass();
    virtual ~CMyClass();
    friend CMyClass operator+(long Dol, CMyClass Curr);
    };#endif
      

  4.   

    分已经给了,不知能否就本问题解释一下为什么从。cpp移到。h又可以了,rebuild all又不行了?为什么在类内部定义就可以?
      

  5.   

    是编译程序进行增量编译的结果,当第一次成功编译后,只有文件被修改了,编译器才会重新编译,对于没有修改的文件,编译器会忽略它。你第一次编译成功后,从.cpp移到.h的过程中,只改了 myclass.h 与 myclass.cpp ,mainf.cpp 并没有被修改,编译器不会再编译mainf.cpp,所以不会产生重复定义(编译覆盖了前一定义),但完全重编译时就出错重复定义错误了。