首頁 >後端開發 >C++ >為什麼我不能將「Container」傳遞給需要「Container」的建構子?

為什麼我不能將「Container」傳遞給需要「Container」的建構子?

Barbara Streisand
Barbara Streisand原創
2024-10-30 08:23:27354瀏覽

Why Can't I Pass a `Container` to a Constructor Expecting `Container`?

模板多態性:當模板發揮不佳時

在 C 中,模板為泛型編程提供了強大的機制。然而,它們的多態行為有其限制。本文回答了特定場景下模板多態性缺失的問題。

查詢

使用者在呼叫建構子時遇到「無符合函數」錯誤它採用 Container& 類型的參數。建構函數在 Bar 類別中定義,使用者建立 Container 的實例。

深入研究多態性

多態性允許不同類別的物件被視為公共基類的物件。但是,此行為不會擴展到 C 中的範本。儘管 Foo 衍生自 Interface,但它不會自動使 Container 成為 Container。需要 Container 的建構子的有效參數。

模板的非協方差

這裡的關鍵方面是缺乏模板協方差。在協變範本中,派生類型會自動被視為需要其基底類型的範本的有效參數。然而,在 C 中,模板不是協變的。

協變的後果

考慮以下範例:

class Fruit {...};
class Apple : public Fruit {...};
class Orange : public Fruit {...};
std::vector<Apple>& apple_vec; // Vector of apples
std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed
fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!

如解釋所指出的,協變處理範本可能會導致應變處理範本可能會導致應變相容的類型被視為相容的情況,從而破壞類型安全。

替代解決方案

因為不支援協變模板C,需要採用替代解決方案。靜態斷言或有界通配符(在 Java 中可用)可用於強制執行所需的型別關係。在查詢中提到的具體場景中,一個簡單的靜態斷言就可以驗證傳入的Container類型確實是Container

以上是為什麼我不能將「Container」傳遞給需要「Container」的建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn