ホームページ >バックエンド開発 >C++ >テンプレート化された C クラスを継承するときにパブリック クラスのメンバーが非表示になるのはなぜですか?

テンプレート化された C クラスを継承するときにパブリック クラスのメンバーが非表示になるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 09:25:021008ブラウズ

Why Are Public Class Members Invisible When Inheriting Templated C   Classes?

テンプレート化された C クラスでの保護クラス メンバーとパブリック クラス メンバーの可視性の継承

継承におけるパブリック メンバーの可視性の問題は、クラス テンプレートが継承するときに明らかになります。提供されたコードに例示されているように、別のクラス テンプレートのメンバー。パブリック メンバーを明示的に再宣言または再定義することなく、CDerived は CBase のすべてのパブリック メンバーを継承します。

問題と解決策

ただし、このコードをテンプレート化すると、CBase のパブリック メンバーが最新の C 標準に準拠したコンパイラの CDerived には見えなくなります。この可視性の問題は、いくつかの解決策を使用して解決できます。

  1. CBase メンバーへの参照の先頭に CBase::
  2. CBase メンバーへの参照の先頭に this->
  3. を付ける
  4. CDerived 内の特定の CBase メンバーに対して using ステートメントを使用する
  5. 「寛容」モードを有効にして C 標準への厳密な準拠を無効にする

既存のソリューションの欠点

これらのソリューションは効果的ではありますが、次のような欠点があります。

  • ソリューション #4 は C 標準から逸脱しており、移植性がありません。
  • ソリューション #1 および #2冗長なコードの追加が必要であり、ソース コードの肥大化につながります。
  • 解決策 #3 では、特に広範な基本クラスの場合、複数の using ステートメントが必要です。

冗長性の低い解決策

マクロを導入すると、解決策 #3 が簡素化され、繰り返しの入力が減ります。

<code class="cpp">#include <boost/preprocessor.hpp>

#define USING_ONE(r, base, member) using base::member;
#define USING_ALL(base, ...) BOOST_PP_SEQ_FOR_EACH(USING_ONE, base, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

// Near CBase<BYTES>
#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>
USING_CBASE(BYTES);</code>

このコードは、using ステートメントを大幅に簡素化し、コードの読みやすさを向上させ、繰り返しの編集を減らします。

以上がテンプレート化された C クラスを継承するときにパブリック クラスのメンバーが非表示になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。