g ++没有匹配的函数调用错误

时间:2010-04-21 17:32:26

标签: c++ compiler-construction g++

我遇到了编译器错误,但我无法弄清楚原因。

.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 个答案:

答案 0 :(得分:3)

从它的外观来看,你的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())
{}

指定成员的初始化方式。 (以上,它默认为不存在的默认构造函数。)

答案 1 :(得分:2)

您的CVektor类没有默认构造函数(即不带参数的构造函数),因此您的CGerade构造函数无法调用它。由于您没有在初始化列表中显式调用CVektor构造函数,因此编译器会隐式尝试调用默认构造函数,但没有可调用,因此您会收到错误。

您应该使用初始化列表显式调用CVektor复制构造函数:

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