C ++构造函数继承没有匹配函数

时间:2015-12-17 13:00:47

标签: c++ templates inheritance c++14

我目前正在开展一个有几个课程的项目:

  • 摘要:template <typename Elem> class Vector {...}

  • 另一个抽象的:template <typename Elem> class AbsPolynom: virtual public Vector<Elem>

  • 来自Vector:template <typename Elem> class Dvector: virtual public Vector<Elem>

  • 的遗产
  • 和最后一个:template <typename Elem> class Polynom: public AbsPolynom<Elem>, public Dvector<Elem>{

    当我打电话给Polynom时,如下所示:Polynom<int> test(std::size_t(3),3,3);

我收到此错误:

In file included from Polynom.cpp:6:0,
                 from main2.cpp:4:
Polynom.hpp: In instantiation of ‘Polynom::Polynom(std::size_t, const Elem&, const int&) [with Elem = int; std::size_t = long unsigned int]’:
main2.cpp:10:41:   required from here
Polynom.hpp:14:105: error: no matching function for call to ‘Vector::Vector()’
   Polynom(std::size_t dim, const Elem& value, const int& degrees ): AbsPolynom(dim, value, degrees) {};

所以这是我的问题:为什么它从Vector调用这个构造函数?我总是有一个参数但它初始化这个没有参数的类

以下是我的构造函数:

Polynom:

Polynom(std::size_t dim, const Elem& value, const int& degrees ): AbsPolynom<Elem>(dim, value, degrees) {}; 

Polynom(std::size_t dim, const Elem& value, const int degrees[] ): AbsPolynom<Elem>(dim, value, degrees) {};

Polynom(std::size_t dim, const Elem values[], const int& degrees): AbsPolynom<Elem>(dim, values, degrees) {};   

Polynom(std::size_t dim, const Elem values[], const int degrees[]): AbsPolynom<Elem>(dim, values, degrees) {};

AbsPolynom:

explicit AbsPolynom(std::size_t, const Elem&, const int& );     
explicit AbsPolynom(std::size_t, const Elem&, const int [] );       
explicit AbsPolynom(std::size_t, const Elem [], const int& );   
explicit AbsPolynom(std::size_t, const Elem [], const int [] ); 

template <typename Elem>AbsPolynom<Elem>::AbsPolynom(std::size_t dim, const Elem& value, const int& degrees ): Vector<Elem>(dim, value), _degrees(new Elem[dim]),_polynomDegree(degrees)  {
    for (std::size_t i = 0; i < dim; ++i) _degrees[i]  = degrees;}

    template <typename Elem>AbsPolynom<Elem>::AbsPolynom(std::size_t dim, const Elem& value, const int degrees[] ): Vector<Elem>(dim, value), _degrees(new Elem[dim]),_polynomDegree(degrees[0])  {
    for (std::size_t i = 0; i < dim; ++i) _degrees[i]  = degrees[i];}


    template <typename Elem>AbsPolynom<Elem>:: AbsPolynom(std::size_t dim, const Elem values[], const int& degrees): Vector<Elem>(dim, values), _degrees(new Elem[dim]),_polynomDegree(degrees)  {
    for (std::size_t i = 0; i < dim; ++i) _degrees[i] = degrees;}

    template <typename Elem>AbsPolynom<Elem>::AbsPolynom(std::size_t dim, const Elem values[], const int degrees[]): Vector<Elem>(dim, values), _degrees(new Elem[dim]),_polynomDegree(degrees[0])  {
    for (std::size_t i = 0; i < dim; ++i) _degrees[i] = degrees[i];}

和矢量:

    explicit Vector(std::size_t dim, const Elem& elem);    
    explicit Vector(std::size_t, const Elem[] );

template <typename Elem>Vector<Elem>::Vector (std::size_t dim, const Elem& elem):_dim(dim), _values(new Elem[dim]) {
for (std::size_t i = 0; i < dim; ++i) _values[i] = elem;      }

template <typename Elem>Vector<Elem>::Vector ( std::size_t dim, const Elem elem[]):_dim(dim), _values(new Elem[dim]) {
for (std::size_t i = 0; i < dim; ++i) _values[i] = elem[i];
}

1 个答案:

答案 0 :(得分:1)

当您具有虚拟继承时,派生程度最高的类必须调用虚拟基类的构造函数。只有一个副本,它必须只调用一次。

如果没有调用,编译器会尝试调用默认构造函数(如果没有则会失败)。