2010-04-21 103 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 
} 
相關問題