2010-04-21 102 views
1

我有一个编译器错误,但我找不出原因。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&) 
+3

通常的呻吟,像_CGERADE_HPP名在C++保留 - 有自动执行此。 – 2010-04-21 17:42:47

+1

另一个通常的呻吟声中没有提供适用的源代码,错误在CGerade.cpp的第10行,而只有前7行出现在问题中。 – 2010-04-21 17:50:00

回答

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

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

+0

我不同意“可能应该”。 'CVektor'没有默认的构造函数可能非常合理。 – Gorpik 2010-04-21 17:40:32

+1

@Gorpik:为什么不呢? (0,0,0)是完全默认的。 – GManNickG 2010-04-21 17:45:38

+0

拯救独角兽:尽管有这个名字,但我们并不知道'CVektor'类的目的是什么。有很多类不应该有默认的构造函数。 – Gorpik 2010-04-22 09:59:48

2

您的CVektor类没有默认构造函数(即不带参数),因此您的CGerade构造函数不能调用它。由于您没有明确地在初始化程序列表中调用CVektor构造函数,因此编译器隐式地尝试调用默认构造函数,但没有可调用的,因此会出错。

你应该使用初始化列表显式调用CVektor拷贝构造函数:

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