2016-09-22 166 views
0

我已经实现了一个可以正常工作的类复合体。导致问题的头文件

http://coliru.stacked-crooked.com/a/b6bff3884e8e2460

现在我想产生一个头文件:

// 
// cplex.h 
// 
// 
// 
// 
// 


#ifndef cplex_h 
#define cplex_h 
#include <iostream> 



class complex 
{ 
    friend complex operator-(const complex& c); 
    friend complex operator +(const complex& c1 , const complex& c2); 
    friend complex operator +(const complex& c1 , const double& db); 
    friend complex operator +(const double& db , const complex& c1); 

    friend complex operator-(const complex& c1, const double& d); 
    friend complex operator-(const complex& c1 , const complex& c2); 
    friend complex operator-(const double& d ,const complex& c1); 
    friend complex operator *(const complex& c1 , const complex& c2); 
    friend complex operator *(const complex& lhs , const double& rhs); 
    friend complex operator *(const double& lhs , const complex& rhs); 
    friend complex operator /(const complex& lhs, const complex& rhs); 
    friend complex operator /(const complex& lhs, const double& rhs); 
    friend complex operator /(const double& lhs, const complex& rhs); 
    friend std::istream& operator>>(std::istream &is , complex &cp); 



private: 
    double re; 
    double im; 


public: 
    // constructors 

    complex(); // default constructor; 
    constexpr complex(const double real,const double img); 
    complex(double real); 
    complex(const complex& rhs); 


    // member functions; 
    double real() const; 
    double imag() const; 


    complex& operator = (const complex&); 
    complex& operator =(const double &); 

    complex& operator += (const complex&); 
    complex& operator +=(const double& other); 

    complex& operator -=(const double& db); 
    complex& operator -= (const complex&); 

    complex& operator *=(const double& db); 
    complex& operator *= (const complex&); 

    complex& operator /=(const double& db); 
    complex& operator /= (const complex&); 

}; 


std::ostream& operator <<(std::ostream &os ,const complex &cp); 





#endif /* cplex_h */ 

好了,所以最后我想要做一些cxxtest和我调用默认的构造函数(complex x;) 我得到一个错误信息:

duplicate symbol _main in: /var/folders/08/s_gsvpm577vgftp3tj2_47hr0000gn/T//ccbn1AAH.o complex.o ld: 1 duplicate symbol for architecture x86_64 collect2: error: ld returned 1 exit status

#include "cplex.h" 
#include <cxxtest/TestSuite.h> 

class cptests : public CxxTest::TestSuite 
{ 
public: 

    void test1(void) 
    { 
     complex x; 

     TS_ASSERT_EQUALS(x.real(), 0); 
     TS_ASSERT_EQUALS(x.imag(), 0) 

    } 

}; 

在另一方面,如果我尝试调用另一个构造

complex x(5.0,5.0);

,而不是

complex x;

我得到的错误信息:

In file included from cptests.h:9:0, 
       from runner.cpp:23: 
cplex.h:45:15: warning: inline function 'constexpr complex::complex(double, double)' used but never defined 
    constexpr complex(const double real,const double img); 
      ^
Undefined symbols for architecture x86_64: 
    "complex::complex(double, double)", referenced from: 
     cptests::test1()  in ccpZuOPa.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

我知道我的构造精细工作:测试他们在类复杂。

试图解决这些问题,我有几个问题:

请问我constexpr构造已经被我的头类中定义?即使它已经在课堂复合体中定义。

这些函数是否在类complex中定义,需要在头文件的类中声明:在我的情况下,class:complex?那么非成员功能呢?

回答

1

第一个错误消息是由于名为_main的重复符号。这意味着一个;

  • 编译单元,其限定在main()构建列出了两次(在连接时例如在目标文件中指定两次);或

  • main()的定义在头文件中,它包含在两个编译单元中。这也可能表明您的头文件中包含源文件#include

第二条错误消息(您编辑您的问题,将其删除之前,你有一个)是指编译器认为你已经调用构造函数三个参数,而不是两个(与你的描述)。我的猜测是拼写错误,所以你认为你输入了complex x(5.0,5.0),但实际上输入了complex x(5.0, 5,0),即,(逗号)而不是.(小数点)。

有关未定义构造函数的警告反映编译器需要查看所有constexpr函数的定义,否则无法在编译时对它们进行求值。