検討:
template <typename T>
class Base
{
public:
static const bool ZEROFILL = true;
static const bool NO_ZEROFILL = false;
}
template <typename T>
class Derived : public Base<T>
{
public:
Derived( bool initZero = NO_ZEROFILL ); // NO_ZEROFILL is not visible
~Derived();
}
これを GCC g++ 3.4.4 (cygwin) でコンパイルできません。
これらをクラス テンプレートに変換する前は、それらは非ジェネリックであり、派生クラスは基本クラスの静的メンバーを参照できました。この可視性の喪失は C++ 仕様の要件ですか、それとも構文を変更する必要がありますか?
Base<T>
の各インスタンス化には独自の静的メンバー " ZEROFILL
" と " NO_ZEROFILL
" がBase<float>::ZEROFILL
あり、それは異なる変数であることは理解していますがBase<double>::ZEROFILL
、あまり気にしません。定数は、コードを読みやすくするためにあります。マクロやグローバルよりも名前の競合に関して安全であるため、静的定数を使用したかったのです。