4

私はこのようなことをしたい:

template<template<int d, class>
         class container,
         int dim = d, typename content_data_type>
class MyClass {
};

私のコンパイラは、「d」が次の外部で定義されていないため、これは不可能であると言っています。

template<int d, class> class container

これを行う別の方法はありますか?

このトピックについてご協力いただきありがとうございます。

アップデート:

@ Rook: 特殊化で後で「dim」および「content_data_type」パラメータにアクセスしたい

例えば

一般クラス:

template<template<int d, class>
         class container>
class MyClass {
};

仕様 クラス:

template<>
class MyClass<vec> {
    vec c; // Error: vec needs template parameters
};

テンプレートクラス「vec」をテンプレートパラメーターなしで使用したため、これによりエラーが発生しました。たとえば、使用するときに、コンパイラーがテンプレートパラメーターを推測することを期待していました

MyClass<vec<3, float> >

変数「c」は型を持つ必要があります

vec<3, float>

これが機能しなかったため、次のように特殊化クラスでアクセスできる 2 つの明示的なテンプレート パラメーター "dim" と "content_data_type" を作成できると考えました。

template<template<int d, class t>
     class container,
     int dim = d, typename content_data_type = t>
class MyClass<vec> {
    vec<dim, content_data_type> c;
};

...そして、最初の質問で十分に具体的でなかったことをもう一度申し訳ありません:)

4

3 に答える 3

3

私はあなたがしていることが意味をなさないと思うので、答えは「いいえ」です。

テンプレートパラメータcontainerクラステンプレートであり、クラスではありません。がMyClassインスタンス化されると、その引数はテンプレート全体であり、インスタンス化の1つだけではありません。したがって、独自のテンプレートパラメータの値がないためMyClass、のディメンションを「のディメンション」にデフォルト設定することはできません。クラスは、の値が異なる1つ以上のインスタンスを作成して使用できますが、特にそれらのいずれも指定されておらず、テンプレートが指定されています。containercontainerMyClasscontainerd

類推して、関数へのポインタをfパラメータとして関数に渡すと仮定しますgfその場合、の定義で「渡された引数」を使用することはできませんg。この関数は、異なる引数を使用して1回以上g呼び出すことができますが、特に1回の呼び出しは与えられず、関数が与えられます。f

あなたのアップデートから:

例:私が使用するときMyClass<vec<3, float> >

あなたは使用しませんMyClass<vec<3, float> >、そのようなことはありません。私が言うように、クラスではなくテンプレートMyClassを取ります。テンプレートであり、クラスです。テンプレートパラメータとしてテンプレートはまったく必要ないようです。vecvec<3, float>

于 2012-06-27T09:02:12.750 に答える
2

通常、コンテナはdimメンバーを公開するため、これは機能します。

template< template< int, class> class container, int dim, class content_data_type >
class MyClass 
{
public:
  typedef typename container< dim, content_data_type > container_type;

  static const int dim = container_type::dim;
};

template< int d, class >
class acontainer
{
public:
  static const int dim = d;
};

MyClass< acontainer, 2, sometype > x;
std::cout << "container size " << x.dim << std::endl;
于 2012-06-27T09:04:26.390 に答える
0

以下は回避策です。ただし、2 つの引数をタイプとして定義し、コンテナ クラスによって公開される静的にする必要があります (例を参照)boost::array

#include <iostream>

template <int d, class T>
struct container
{
  typedef T value_type;
  static const int static_size = d;
};

template<typename cont, int d = cont::static_size, class T = typename cont::value_type>
struct A
{
  static const int dimension = d;
};

int main(void)
{
  A<container<10, int> > a;
  std::cout << a.dimension << std::endl;
}
于 2012-06-27T09:20:35.423 に答える