2

重複の可能性:
「template」および「typename」キーワードをどこに、なぜ配置する必要があるのですか?

タイプTとパラメータNを引数として取り、TのN番目のグレードのポインタを'与える'テンプレートを作成したい(たとえば、TがintでNが2与えられる場合int**

これまでの私のコードは次のとおりです。

template<class T,int N>
struct ptr
{
  typedef ptr<T*,N-1>::t t;
};

template<class T>
struct ptr<T,0>
{
  typedef T t;
};

int main()
{
  ptr<int,3>::t a; //a should be int***
}

しかし、それは私にこのコンパイラエラーを与えます:

source.cpp:6:11: error: need 'typename' before 'ptr<T*, (N - 1)>::t' because 'ptr<T*, (N - 1)>' is a dependent scope

これはどういう意味で、どのように修正できますか(C ++で可能な場合)?

4

2 に答える 2

3

エラーは、それptr<T*, (N - 1)>::t依存名であることを意味します。

テンプレート定義で使用される意味はtテンプレートパラメータに依存するため、コンパイラはそれtがオブジェクトではなくタイプであると自動的に判断することはできません。

エラーを修正するには、コンパイラにヒントを与える必要があります。つまり、メッセージが示唆することを文字通り実行する必要があります。typename

typedef typename ptr<T*,N-1>::t t;
于 2012-09-04T12:08:33.383 に答える
2
template<class T,int N>
struct ptr
{
  typedef typename ptr<T*,N-1>::t t;
};

template<class T>
struct ptr<T,0>
{
  typedef T t;
};

int main()
{
  ptr<int,3>::t a; //a should be int***
}

コンパイラはそれを指示するtので、前にdependent name使用してくださいtypenameptr<T*, (N - 1)>::t

于 2012-09-04T12:07:29.583 に答える