没有匹配函数来调用到“标准构造”(no matching function to call to “

2019-07-18 13:30发布

我从我的C ++编译器一个奇怪的反应。 我在网上搜索,但什么也没有有用或有益想出了...

编译器响应:

floating.hpp |在线29 |警告:`类HexFloatingPoint”有虚函数,但非虚析构函数

在构造函数中`HexFloatingPoint :: HexFloatingPoint(INT,INT)“:

floating.cpp | 5号线|错误:调用`浮点::浮点不匹配功能()

floating.hpp | 16行|注:考生:浮点::浮点(const的浮点和)

floating.cpp |线路3 |注:浮点::浮点(INT,INT)

这些都是代码文件:

main.cpp中

#include <iostream>
#include "floating.hpp"

using namespace std;

int main(int argc, char* argv[])
{

    return 0;
}

floating.hpp

#ifndef FLOATING
#define FLOATING

#include <string>
#include <vector>

using namespace std;

class FloatingPoint;
class HexFloatingPoint;
class HexDigit;
class HexDigitBool;
class HexDigitChar;

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number);
    virtual void print();
};

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    ~HexFloatingPoint();
};

class HexDigit
{
public:
    virtual void print()=0;
    virtual void set_value(char c);
    virtual int get_value();
};

class HexDigitBool : public HexDigit
{
private:
    bool b[4];
public:
    void print();
    virtual void set_value(char c);
    virtual int get_value();
};

class HexDigitChar : public HexDigit
{
private:
    char c;
public:
    void print();
    virtual void set_value(char c);
    virtual int get_value();
};


#endif

floating.cpp

#include "floating.hpp"

FloatingPoint::FloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}
void HexFloatingPoint::set_significant(string number){}
void HexFloatingPoint::set_exponent(string number){}
void HexFloatingPoint::print(){}
HexFloatingPoint::~HexFloatingPoint(){}

我希望你能帮助我。 我已经尝试添加浮点(); 在floating.hpp和floating.cpp但它并没有帮助。

更新1

更改构造器

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : FloatingPoint(sign_length,exp_length){}

编译说没有...

floating.o||In function `_ZNSt12_Vector_baseIP8HexDigitSaIS1_EED2Ev':|
stl_vector.h:(.text+0x8)||undefined reference to `vtable for FloatingPoint'|
floating.o||In function `_ZN13FloatingPointC1Eii':|
floating.cpp|3|undefined reference to `vtable for FloatingPoint'|'

更新2

更改

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number);
    virtual void print();
};

class FloatingPoint
{
private:
    int significant_length;
    int exponent_length;

public:
    FloatingPoint(int sign_length,int exp_length);
    virtual void set_significant(string number) = 0;
    virtual void set_exponent(string number) = 0;
    virtual void print() = 0;
};

解决了更新1发生错误

改变

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    ~HexFloatingPoint();
};

class HexFloatingPoint : public FloatingPoint
{
private:
    vector<HexDigit*> significant_length;
    vector<HexDigit*> exponent_length;
public:
    HexFloatingPoint(int sign_length,int exp_length);
    void set_significant(string number);
    void set_exponent(string number);
    void print();
    virtual ~HexFloatingPoint();
};

解决警告

改变

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : significant_length(sign_length),exponent_length(exp_length){}

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) : FloatingPoint(sign_length,exp_length),significant_length(sign_length),exponent_length(exp_length){}

固定的第一个问题

非常感谢球员!

Answer 1:

HexFloatingPoint源自FloatingPoint ,但你不叫任何的FloatingPoint “在初始化器表S构造HexFloatingPoint的构造。 这意味着默认的(无参数)构造函数FloatingPoint被调用,但该类不定义它,所以你的错误。

无论调用构造函数FloatingPointHexFloatingPoint的初始化器列表,或者给FloatingPoint默认构造函数。



Answer 2:

In constructor `HexFloatingPoint::HexFloatingPoint(int, int)':

floating.cpp|line 5|error: no matching function for call to `FloatingPoint::FloatingPoint()'

floating.hpp|line 16|note: candidates are: FloatingPoint::FloatingPoint(const FloatingPoint&)

floating.cpp|line 3|note: FloatingPoint::FloatingPoint(int, int)

一旦你为你的类中的任何构造你还必须明确提供一个构造函数,如果你的代码调用无参数的构造函数不带任何参数。

警告清楚地告诉你,你的代码调用时,它调用构造一个无参数的构造函数:

HexFloatingPoint(int, int)

因此,要么:

  • 你应该提供一个无参数的构造函数或明或
  • 您应该使用成员初始化列表 ,并从基类的构造函数调用所期望的版本,如果你不想提供一个默认的基类无参数的构造函数。

    floating.hpp |在线29 |警告:`类HexFloatingPoint”有虚函数,但非虚析构函数

这是一个重要的警示。 你的类HexFloatingPoint有一个virtual ,这意味着它也应该提供一个成员函数virtual析构函数。
请注意,如果你没有在你的基类提供虚析构函数和调用delete一个基类指针指向派生类对象,然后它会导致不确定的行为。



Answer 3:

floating.hpp |在线29 |警告:`类HexFloatingPoint”有虚函数,但非虚析构函数

虚析构函数添加到HexFloatingPoint:

virtual ~HexFloatingPoint(); 

只要一个类有虚函数,你需要声明/定义虚拟析构函数,否则,如果你通过一个基类指针或在客户机代码的引用访问派生类,它可能发生在派生类中没有按的析构函数“T被调用的行为是不确定的。 通常,对象的导出部分不被删除(通过碱引用或指针访问)在这种情况下,如果只剩下内存泄漏。 检查出有效的C ++,第7项。

floating.hpp |在线29 |警告:`类HexFloatingPoint”有虚函数,但非虚析构函数

只要你定义一个类的构造函数,默认的构造函数HexFloatingPoint()不会自动定义,你需要明确地将它添加到类声明/定义。



Answer 4:

首先,错误。 您的构造HexFloatingPoint未初始化的基类, FloatingPoint 。 既然你已经定义了一个构造函数取两个参数,以及(不含参数)没有默认构造函数,派生类必须使用你定义构造函数初始化它:

HexFloatingPoint::HexFloatingPoint(int sign_length,int exp_length) :
    FloatingPoint(sign_length, exp_length),  // ADD THIS
    significant_length(sign_length),
    exponent_length(exp_length)
{}

或者,您可能希望能够离开基类成员未初始化,初始化或他们默认值,在这种情况下,你需要提供一个默认的构造函数:

FloatingPoint() {} // or initialise the members if you want

但是这可能不是你想要做什么; 你可能要适当地初始化它们。

其次,该警告。 通常,当你有一个多态基类,你要通过一个指向基类中删除派生的对象。 此如果基类声明了一个虚析构函数只允许; 否则,这样的缺失给未定义的行为。 我建议你遵循编译器的建议,并添加一个:

virtual ~FloatingPoint() {}

最后,一旦你已经解决了编译器错误,那么(假定有没有比你贴什么更多的代码),你会得到链接错误,由于缺少定义FloatingPoint::set_exponentFloatingPoint::print 。 这是因为你已经声明他们的虚拟但不纯洁,还没有实现它们。 他们可能想成为纯虚像set_significant

virtual void set_exponent(string number) = 0;
                                         ^^^


文章来源: no matching function to call to “standard constructor”