2017-04-22 205 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