20

constこのテンプレートのキーワードの効果は何ですか?

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix

constこのテンプレートはas パラメータのみを受け入れるということですか? もしそうなら、変数をCOLNUMandとして渡す方法はありROWNUMますか?

(テンプレートの COLNUM として変数を渡そうとすると、「IntelliSense: 式には定数値が必要です」というエラーが表示されます)

4

2 に答える 2

21

無視されます:

[C++11: 14.1/4]:タイプ以外のテンプレート パラメータには、次のいずれかのタイプ (オプションでcv-qualified ) が必要です。

  • 整数型または列挙型、
  • オブジェクトへのポインタまたは関数へのポインタ、
  • オブジェクトへの左辺値参照または関数への左辺値参照、
  • メンバーへのポインター、
  • std::nullptr_t.

[C++11: 14.1/5]:[注:テンプレート引数の形式を管理する規則(14.3)によって、以下で明示的に、または暗黙的に、他の型は許可されません。--end note ] template-parameterの最上位のcv-qualifiersは、そのタイプを決定するときに無視されます。

同じ文言が C++03 の同じ場所にあります。

これは、テンプレートの引数がコンパイル時に既知である必要があるためです。したがって、constそこにあるかどうかに関係なく、変数値を渡すことはできません

template <int N>
void f()
{
    N = 42;
}

template <int const N>
void g()
{
    N = 42;
}

int main()
{
    f<0>();
    g<0>();

    static const int h = 1;
    f<h>();
    g<h>();
}

prog.cpp: 関数 '<strong>void f() [with int N = 0]':
prog.cpp:15: ここからインスタンス化されました
prog.cpp:4: エラー:代入 prog.cppの左オペランドとして左辺値が必要です
: 関数 '<strong>void g() [with int N = 0]':
prog.cpp:16: ここからインスタンス化されました
prog.cpp:10: エラー:割り当ての左オペランドとして左辺値が必要です
prog.cpp: 関数内'<strong>void f() [with int N = 1]':
prog.cpp:19: ここからインスタンス化されました
prog.cpp:4: エラー:左辺値が割り当ての左オペランドとして必要です
prog.cpp: 関数内 '<strong >void g() [with int N = 1]':
prog.cpp:20: ここからインスタンス化されました
prog.cpp:10: エラー:代入の左オペランドとして必要な左辺値

于 2012-11-17T22:15:24.390 に答える
3

constあなたの場合は必要ありません

たとえば、コンパイラの観点でMatrix_Aは、クラスとMatrix_B以下の両方が同じです。これは、とが人間の観点からは一定であるという事実を強制するためのものですが、必須ではありません。constROWNUMCOLNUM

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix_A 
{
};

template <class T, int       ROWNUM, int       COLNUM> 
class Matrix_B
{
};

さらに、次のクラスMatrix_Cも同様の定数変数ROWNUMCOLNUM別の方法で指定します。

template <class T> 
class Matrix_C
{
   static int const ROWNUM = 5;
   static int const COLNUM = 20;
};

// the following three objects use constant variables ROWNUM and COLNUM
Matrix_A<bool,5,20> a;
Matrix_B<bool,5,20> b;
Matrix_C<bool>      c;
于 2012-11-17T22:24:11.080 に答える