簡體   English   中英

繼承的類模板的參數化構造函數

[英]parameterized constructor for inherited class templates

我有多個繼承的類,bur得到錯誤C2<int (__cdecl *)(int)>': no appropriate default constructor available ,但是我為C1,C2定義了參數化構造函數。

一個相關的問題是我是否看到注釋行標記為??? 在一些代碼中。 這是什么意思-它正在從C3初始化C2默認構造函數?

#include <iostream>
int y(int) 
{ int a=1; return a } 

template<typename F>
class C1
{
public:
    F f1;
    C1(F g) : f1(g) {}  
};

template<typename F>
class C2 : public C1<F>
{
public:
    F f2;
    C2(F g) : f2(g) {}  
};

template<typename F>
class C3 : public C2<F>
{
public:
    F f3;
    C3(F g) : f3(g) {}
    //C3 (F g) : C2<F>(g) {}        ???
};


int main()
{
    C1 o1(y);
    C2 o2(y);
    C3 o3(y);
}

當您構造另一個類的子類時,將調用父類的默認構造函數(除非像標記為???行中那樣顯式調用另一個)。 但是,看到為每個類都提供了構造函數時,編譯器並未生成隱式默認構造函數。 因此,當您創建C2的實例時,編譯器嘗試調用缺少的C1默認構造函數,因此找不到它。

如果您提供默認構造函數,則可以使用:

#include <iostream>
int y(int) {
    int a=1;
    return a;
} 

template<typename F>
class C1 {
public:
    F f1{};

    C1() = default;

    C1(F g)
        : f1(g)
    { }  
};

template<typename F>
class C2 : public C1<F>
{
public:
    F f2{};

    C2() = default;

    C2(F g) 
        : f2(g)
    { }  
};

template<typename F>
class C3 : public C2<F>
{
public:
    F f3{};

    C3() = default;

    C3(F g) 
        : f3(g) 
    { }
    //C3 (F g) : C2<F>(g) {}        ???
};


int main()
{
    C1 o1(y);
    C2 o2(y);
    C3 o3(y);
}

標記為???的行 調用特定的父構造函數,而不是依賴對父類的默認構造函數的隱式調用。

因此,您可以提供如上所述的默認構造函數,也可以采用??? 行語法來調用特定的構造函數-這取決於您的類設計和意圖。

正如Sam所說, C2的構造函數正在嘗試調用C1的默認構造函數,該默認構造函數不存在。 同樣, C3嘗試調用C2的默認構造函數。

有兩個修復程序:

  • 定義C1C2默認構造函數,或:

  • 修改C2的構造函數以調用確實存在的構造函數,如下所示:

    C2(F g) : C1 <F> (g), f2(g) {}

  • 和類似的C3的構造函數,如下所示:

    C3(F g) : C2 <F> (g), f3(g) {}

我認為,這本身可以回答您的第二個問題。

C2<F>(g)通過調用其構造函數來初始化基類。 如果您自己不調用構造函數,則編譯器將嘗試為基類( C2<F>::C2() )調用默認構造函數。 您的所有類都沒有默認構造函數,這是錯誤的根源。 但是實際上您應該做的是自己調用基類構造函數。

C2(F g) : C1<F>(g), f2(g) {}
C3(F g) : C2<F>(g), f3(g) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM