私はC++に精通していると思いましたが、どうやら十分に精通していないようです。
問題は、テンプレートクラスで定数を定義する場合、そのクラスから派生する新しいクラスでは定数を使用できますが、それから派生する新しいテンプレートクラスでは使用できないことです。
たとえば、gccは言います
test.h:18:エラー:「定数」はこのスコープで宣言されていません
この(簡略化された)ヘッダーファイルをコンパイルしようとすると、次のようになります。
#pragma once
template <typename T> class base
{
public:
static const int theconstant = 42;
};
class derive1 : public base<size_t>
{
public:
derive1(int arg = theconstant) {}
};
template<typename T> class derive2 : public base<T>
{
public:
derive2(int arg = theconstant) {} // this is line 18
};
したがって、問題は、一方のクラスderive1
が正常にコンパイルされるのに対しderive2
、テンプレートの特殊化であるもう一方のクラスは正常にコンパイルされないことです。
gccのエラーは十分に明確ではないかもしれませんが、のコンストラクターがのコンストラクターとderive2
は異なるスコープを持つ理由がわかりませんderive1
。
重要な場合、これは、タイプのオブジェクトをインスタンス化するときではなく、ヘッダーファイル自体のコンパイル中に発生しますderive2<type>
。
また、このコンパイルを行うために何を変更するかを知っているので、答えとして1行のコードを実際に探しているわけではありません。なぜこれが起こるのか理解したいです!Webを検索しようとしましたが、正しい検索引数を使用していないようです。