[英]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
的默認構造函數。
有兩個修復程序:
定義C1
和C2
默認構造函數,或:
修改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.