g ++ нет соответствующей ошибки вызова функции - PullRequest
1 голос
/ 21 апреля 2010

У меня ошибка компилятора, но я не могу понять, почему.

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

.cpp:

#include "CGerade.hpp"

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

сообщение об ошибке:

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&)
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&)

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Судя по всему, у вашего CVektor класса нет конструктора по умолчанию, который CGerade использует в вашем конструкторе:

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

Вы можете (и, вероятно, должны) добавить его, но лучшечтобы использовать список инициализации для инициализации элементов:

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

, который указывает, как инициализируются элементы.(И выше, по умолчанию использовался несуществующий конструктор по умолчанию.)

2 голосов
/ 21 апреля 2010

Ваш класс CVektor не имеет конструктора по умолчанию (то есть того, который не принимает аргументов), поэтому ваш конструктор CGerade не может его вызвать. Поскольку вы явно не вызываете конструктор CVektor в своем списке инициализатора, компилятор неявно пытается вызвать конструктор по умолчанию, но его нет, поэтому вы получаете ошибку.

Вы должны явно вызвать конструктор копирования CVektor, используя список инициализаторов:

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