2017-04-22 203 views
3

我收到錯誤「A:沒有適當的默認構造函數可用。」它指向我的行號是我初始化B類的行。C++沒有合適的默認構造函數可用

我曾嘗試做類似帖子中建議的初始化列表,但它沒有解決錯誤。

該程序有很多其他功能,我爲了可讀性和簡單性的目的而剪切出來,因爲它們與錯誤無關。

我正在創建一個B對象,它在構造函數中創建兩個A類對象,每個對象都接收一個指向單獨函數的指針。

// Class A 
template <typename T> class A 
{ 
public: 

// constructor 
A(int c, bool(*Ptr)(T, T)); 
}; 


// Class B 
template <typename T> class B 
{ 
public: 
//constructor 
B(int c); 

A <T> oneHolder; // Class A objects 
A <T> twoHolder; 

bool(*lowPtr)(T, T) = &lowerThan;   // pointer to a function 
bool(*highPtr)(T, T) = &higherThan;   // pointer to a function 
}; 

//Class A constructor 
template <typename T> 
A<T>::A(int c, bool(*fPtr)(T, T)) { 

    m_Size = c; 
    // set function pointer 
    func_ptr = fPtr; 

} 


//B Constructor 
template <typename T> 
B<T>::B(int c){ // Might need initialization list, error points here 

    m_Size = c; 

    // Create two A objects 
    A<T> one(c, lowPtr); // passing function pointer 
    A<T> two(c, highPtr); 


    lowHolder = one; 
    highHolder = two; 

} 
+0

沒有爲'one'和'two'沒有默認構造函數,所以你必須 –

+0

初始化它們請發表MCVE,您的代碼使用幾個未聲明的標識符(例如'lowerThan','lowHolder') –

+0

ctor-initializer-list是解決這個問題的正確方法,當你嘗試時出了什麼問題? –

回答

3

您應該從B的構造函數調用A的構造函數。A類沒有默認構造函數。

如果你會改變的構造以下將工作

A(int c = 0, bool(*Ptr)(T, T) = nullptr); 
+0

你能說說你什麼時候說A沒有默認構造函數嗎?在B中,當我創建兩個A對象時,不應該調用A的構造函數嗎? – Grehgous

+0

@Grehgous,你需要爲B的成員變量'oneHolder'和'twoHolder'的構造函數提供參數。 – Yola

+0

@Grehgous例如像這樣'template B :: B(int c):oneHolder(...),twoHolder(...){...}' – Yola