开发者

g++ no matching function call error

开发者 https://www.devze.com 2022-12-28 04:42 出处:网络
I\'ve got a compiler error but I can\'t figure out why. the .hpp: #ifndef _CGERADE_HPP #define _CGERADE_HPP

I've got a compiler error but I can't figure out why.

the .hpp:

#ifndef _CGERADE_HPP
#define _CGERADE_HPP
#include "CVektor.hpp"
#include <string>

class CGerade
{

protected:
    CVektor o, rv;

public:

    CGerade(CVektor n_o, CVektor n_rv);

    CVektor getPoint(float t);

    string toString();
};

the .cpp:

#include "CGerade.hpp"

CGerade::CGerade(CVektor n_o, CVektor n_rv)
{
    o = n_o;
    rv = n_rv.getUnitVector();
}

the error message:

CGerade.cpp:10: error: no matching function for call to ‘CVektor::CVektor()’
CVektor.hpp:28: note: candidates are: CVektor::CVektor(float, float, float)
CVektor.hpp:26: note:                 CVektor::CVektor(bool, float, float, float)
CVekto开发者_StackOverflowr.hpp:16: note:                 CVektor::CVektor(const CVektor&)
CGerade.cpp:10: error: no matching function for call to ‘CVektor::CVektor()’
CVektor.hpp:28: note: candidates are: CVektor::CVektor(float, float, float)
CVektor.hpp:26: note:                 CVektor::CVektor(bool, float, float, float)
CVektor.hpp:16: note:                 CVektor::CVektor(const CVektor&)


From the looks of it, your CVektor class has no default constructor, which CGerade uses in your constructor:

CGerade::CGerade(CVektor n_o, CVektor n_rv)
{ // <-- by here, all members are constructed
    o = n_o;
    rv = n_rv.getUnitVector();
}

You could (and probably should) add one, but better is to use the initialization list to initialize members:

CGerade::CGerade(CVektor n_o, CVektor n_rv) :
o(n_o),
rv(n_rv.getUnitVector())
{}

Which specifies how the members are initialized. (And above, it was defaulting to the non-existent default-constructor.)


Your CVektor class has no default constructor (that is, one that takes no arguments), so your CGerade constructor can't call it. Since you're not explicitly calling a CVektor constructor in your initializer list, the compiler implicitly tries to call the default constructor, but there is none to call, so you get an error.

You should explicitly call the CVektor copy constructor using an initializer list:

CGerade::CGerade(CVektor n_o, CVektor n_rv)
    : o(n_o), rv(n_rv.getUnitVector())
{
    // empty body
}
0

精彩评论

暂无评论...
验证码 换一张
取 消