0

私はテンプレートを持っています:

template<unsigned int N> struct IntN;

template <> struct IntN< 8> {
   typedef uint8_t type;
}; 

template <> struct IntN<16> {
   typedef uint16_t type;
};

そして、主に私はこれを行うことによって初期化して交互にします:

IntN< 8>::type c;

これは機能しているようですが、変数内に値を格納すると機能せず、次のエラーが発生します。

エラー:タイプ'int'の非タイプテンプレート引数は整数定数式ではありません

コードの例を次に示します。

template<unsigned int N> struct IntN;

template <> struct IntN< 8> {
  typedef uint8_t type;
};

template <> struct IntN<16> {
   typedef uint16_t type;
};

int main(int argc, char *argv[]) {
int foo = 8;

IntN<foo>::type c;
}

誰かアイデアはありますか?ありがとう

4

2 に答える 2

7

整数テンプレート パラメーターのテンプレート引数は、定数式でなければなりません。整数リテラルは定数式です

IntN<8>::type c;

定数式で初期化された定数変数は定数式です

const int n = 8;
IntN<n>::type c;

ここで、n は const であり、定数式 (8) によって初期化されるため、問題ありません。ただし、以下はコンパイルされません。

int n = 8;
const int m = n;
IntN<n>::type c; //error n is not const therefore not a constant expression
IntN<m>::type c; //error m is const but initialized with a non-constant expression therefore not a constant expression
于 2012-12-28T14:29:50.453 に答える
0

関数テンプレートは、関数がインスタンス化されるとき(つまり、コードでテンプレート関数を使用するとき) に関数のコードを生成する方法をコンパイラに指示する設計図です。

コンパイラが正確に何を生成するかは、テンプレート パラメーターのインスタンス化された値によって異なります。これらの値は、それまでに認識して確定する必要があります。そうしないと、コンパイラは生成するコードを認識できません。

于 2012-12-28T18:28:59.210 に答える