8

重複の可能性:
GCCの問題:テンプレート引数に依存する基本クラスのメンバーを使用している

私は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を検索しようとしましたが、正しい検索引数を使用していないようです。

4

2 に答える 2

2

試す

template<typename T> class derive2 : public base<T>
{
  public:
    derive2(int arg = base<T>::theconstant) {} // this is line 18
};

基本的に、「theconstant」の不完全なスコープを指定しました。

于 2012-07-01T21:39:49.760 に答える
2

これはあなたが理解するのに役立つと確信しています:

コンパイルしないコード:

template<typename T> class derive2 : public base<T>
{
  public:
    derive2(int arg = theconstant) {} // this is line 18
};

そしてその理由:

template <> class base<size_t>
{
  public:
    static const int ha_idonthave_theconstant = 42;
};
derive2<size_t> impossible_isnt_it; 

スペシャリゼーション!!! 18 行目のコンパイラは、この定数がまったく存在しないように base<> を特殊化しないことを確認できません。

于 2012-07-01T22:36:03.243 に答える