1. ホーム
  2. c++

[解決済み] テンプレート使用時に「定数式に出現できない」と表示された

2022-01-29 06:46:46

質問

template < int >  
  class CAT  
  {};  

  int main()  
  {  
     int i=10;  
     CAT<(const int)i> cat;  
     return 0; //here I got error: ‘i’ cannot appear in a constant-expression  
  }  

   int i=10;  
   const int j=i;  
   CAT<j> cat; //this still can not work

しかし、私はiをconst intに変換しています、なぜコンパイラはまだエラーを報告しますか?
私のプラットフォームはubuntu、gccのバージョンは4.4.3です。

ありがとうございます。

==============

しかし、いくつかのケースでは、私は非恒等変数が必要です。

例えば

  //alloperations.h   
  enum OPERATIONS  
  {  
       GETPAGE_FROM_WEBSITE1,  
       GETPAGE_FROM_WEBSITE2,  
       ....  
  };  


  template< OPERATIONS op >  
  class CHandlerPara  
  {  
       static string parameters1;         
       static string parameters2;         
       ....  
       static void resultHandler();  
  };     


  //for different operations,we need a different parameter, to achieve this  
  //we specified parameters inside CHandler, for  example  

  template<>  
  string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters1("&userid=?&info=?..")  

  template<>  
  string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters2("...")  

他のモジュールはこのテンプレートを使って、対応するパラメータを取得します。
そして、特別な動作のためにresultHandler関数を指定するかもしれません。

どのように解決するのですか?

非タイプのテンプレート引数は、コンパイル時定数である必要があります。 型でないテンプレートの引数をコンパイル時に定数にする必要があります。 intconst int は、コンパイル時定数にはなりません。 コンパイル時に定数化するためには 10 を直接入力します。

CAT<10> cat;

または i a const int :

const int i = 10;
CAT<i> cat;