没有匹配函数来调用“标准构造器” [英] no matching function to call to "standard constructor"

查看:203
本文介绍了没有匹配函数来调用“标准构造器”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从c ++编译器得到一个奇怪的回应。我搜索互联网,但没有提供有用的或有用的...



编译器响应:


floating.hpp | line 29 | warning:`HexFloatingPoint'有虚函数但非虚析法



'HexFloatingPoint :: HexFloatingPoint(int,int)':



floating.cpp | line 5 |错误:没有匹配的函数调用FloatingPoint :: FloatingPoint



floating.hpp | line 16 |注意:候选项是:FloatingPoint :: FloatingPoint(const FloatingPoint&)



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


这些是代码文件: p>

main.cpp

  #include< ; iostream> 
#includefloating.hpp

using namespace std;

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

return 0;
}

floating.hpp
$ b

  #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();
};

类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();
};

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

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


#endif

floating.cpp

  #includefloating.hpp

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

HexFloatingPoint :: HexFloatingPoint(int sign_length,int exp_length) void HexFloatingPoint :: SetSignificant(string number){}
void HexFloatingPoint :: set_exponent(string number){}
void HexFloatingPoint :: print(){}
HexFloatingPoint ::〜HexFloatingPoint {}

我希望你能帮助我。我已经试图添加FloatingPoint();在floating.hpp和floating.cpp,但它没有帮助。



UPDATE 1



已将构造函数更改为

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

编译器说不...

  floating.o ||在函数`_ZNSt12_Vector_baseIP8HexDigitSaIS1_EED2Ev':| 
stl_vector.h :(。text + 0x8)||未定义的引用`vtable for FloatingPoint'|
floating.o ||在函数`_ZN13FloatingPointC1Eii'中:|
floating.cpp | 3 |未定义引用`vtable for FloatingPoint'|'

strong> UPDATE 2



更改

  
{
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){} 

修复第一个问题



感谢很多人!

解决方案

 在构造函数HexFloatingPoint :: HexFloatingPoint(int,int)':

floating.cpp | line 5 | error:调用FloatingPoint :: FloatingPoint()'

floating.hpp | line 16 |注意:候选者是:FloatingPoint :: FloatingPoint(const FloatingPoint&)

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

你的类也必须显式地提供一个构造函数,如果你的代码调用无参数构造函数,它不会接受任何参数。



警告清楚地告诉你,当调用构造函数时,没有参数构造函数:

  HexFloatingPoint(int,int)



因此:





这是一个重要的警告。你的类 HexFloatingPoint 有一个 virtual 成员函数,意味着它也应该提供一个 / code>析构函数。

请注意,如果你不在你的基类中提供一个虚拟析构函数,并且在基类上调用 delete 指针指向一个派生类对象,那么它将导致未定义的行为。


I get a weird response from my c++ compiler. I searched the internet but came up with nothing usefull or helpfull...

Compiler Response:

floating.hpp|line 29|warning: `class HexFloatingPoint' has virtual functions but non-virtual destructor

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)

These are the code files:

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(){}

I hope that you can help me. I already tried to add FloatingPoint(); in floating.hpp and floating.cpp but it didn't help.

UPDATE 1

Changed Constructor to

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

Compiler said no ...

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'|'

UPDATE 2

Changing

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();
};

to

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;
};

resolved the errors occured in update 1

changing

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();
};

to

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();
};

resolved warning

changing

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

to

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

fixed first problem

Thanks a lot guys!!

解决方案

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)

Once you provide any constructor for your class you also have to explicitly provide a constructor which does not take any parameters if your code invokes the no argument constructor.

The warning clearly tells you that your code invokes a no argument constructor when it calls the constructor for:

HexFloatingPoint(int, int)

So either:

This is an important warning. Your class HexFloatingPoint has an virtual member function which implies that it should also provide an virtual destructor.
Note that if you do not provide a virtual destructor in your base class and you call delete on a base class pointer pointing to a derived class object then it will result in Undefined Behavior.

这篇关于没有匹配函数来调用“标准构造器”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆