没有匹配函数来调用“标准构造器” [英] no matching function to call to "standard constructor"
问题描述
我从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:
- You should provide a no argument constructor explicitly or
You should use member initializer list and invoke the desired version of constructor from base class if you don't want to provide a default no argument constructor for the base class.
floating.hpp|line 29|warning: `class HexFloatingPoint' has virtual functions but non-virtual destructor
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屋!