没有用于调用'X :: X()'的匹配函数

时间:2016-07-06 17:19:54

标签: c++ inheritance initializer-list

我有一个基础和派生类的应用程序。我需要在派生类中有一个基类的字段,但是在初始化它时会遇到一些问题。这是代码:

#include <iostream>
using namespace std;

class X
{
public :
    X( int x ) { }
} ;

class Y : public X
{
    X x ;
    Y* y ;
    Y( int a ) : x( a ) { }
} ;

int main()
{
    return 0;
}

错误:

/tmp/test.cpp||In constructor ‘Y::Y(int)’:|
/tmp/test.cpp|14|error: no matching function for call to ‘X::X()’|
/tmp/test.cpp|14|note: candidates are:|
/tmp/test.cpp|7|note: X::X(int)|
/tmp/test.cpp|7|note:   candidate expects 1 argument, 0 provided|
/tmp/test.cpp|4|note: X::X(const X&)|
/tmp/test.cpp|4|note:   candidate expects 1 argument, 0 provided|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

2 个答案:

答案 0 :(得分:8)

您需要调用超类构造函数,因为默认构造函数不可用:

Y( int a ) : X(some_int_like_maybe_a), x( a ) { }

另请考虑将X::X(int)标记为explicit

答案 1 :(得分:5)

错误的原因是您没有构建X的{​​{1}}部分。由于Y继承自Y,因此您需要构建X的{​​{1}}部分。既然你没有,编译器会为你做。当它执行此操作时,它使用默认构造函数,X没有,因此您会收到错误。你需要像

这样的东西
Y

构建X的{​​{1}}部分和Y( int a ) : X(some_value), x( a ) { } 的{​​{1}}成员。或者你可以为X添加一个默认构造函数,让它默认构造。