テンプレート化された C クラスでの保護クラス メンバーとパブリック クラス メンバーの可視性の継承
継承におけるパブリック メンバーの可視性の問題は、クラス テンプレートが継承するときに明らかになります。提供されたコードに例示されているように、別のクラス テンプレートのメンバー。パブリック メンバーを明示的に再宣言または再定義することなく、CDerived は CBase のすべてのパブリック メンバーを継承します。
問題と解決策
ただし、このコードをテンプレート化すると、CBase のパブリック メンバーが最新の C 標準に準拠したコンパイラの CDerived には見えなくなります。この可視性の問題は、いくつかの解決策を使用して解決できます。
既存のソリューションの欠点
これらのソリューションは効果的ではありますが、次のような欠点があります。
冗長性の低い解決策
マクロを導入すると、解決策 #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 サイトの他の関連記事を参照してください。