2011-08-24 20 views
1

我想創建一個具有使用作爲模板參數提供的值進行初始化的靜態成員的輕量級模板類(僅允許enum)。具有枚舉的模板無法使用POD模板參數值初始化其成員

下面的代碼不建說

error: wrong number of template arguments (1, should be 2) 
    error: provided for ‘template<field_id field_value, 
    inner_type_id innter_type_value>  struct node’ 
    error: template declaration of ‘field_id m_field_id’ 

這個問題似乎是第一個模板參數。如果我刪除'field_value'和'inneer_type_value'仍然沒有建立說不匹配的錯誤。

你能幫我嗎? 感謝AFG

enum field_id{ FIELD_ID_1, FIELD_I_2 }; 
    enum inner_type_id{ INN_ID_1, INN_ID_2 }; 

    template< enum field_id field_value 
      , enum inner_type_id inner_type_value 
    >struct node{ 
      static field_id m_field_id; 
    }; 

    template< 
      enum field_id field_value 
      ,enum inner_type_id inner_type_value 
    > 
    enum field_id node< 
      enum field_id field_value 
      ,enum inner_type_id inner_type_value 
    >::m_field_id=field_value; 

    int main(){ 
      node<FIELD_ID_1,INN_ID_1> obj; 
      assert(obj::m_field_value == FIELD_ID); 
    } 

我也tyring另一種不同的方法,但我仍然不明白這一點

  template< typename T1, typename T2 > 
     struct node; 

     template<> 
     struct node< enum field_id=FIELD_ID_1, enum inner_type_id=INN_ID_1>{ 
       static enum field_id m_field_id; 
     };    
     note< 
       enum field_id=FIELD_ID_1 
       ,enum inner_type_id=INN_ID_1 
       >::m_field_id=FIELD_ID1; 
+0

嘿!只需添加評論!當我今天早上看了下面的一個迴應,我驚訝地發現一個關於爲什麼'enum'不應該用作模板參數的很好的解釋令人驚訝,它很棒,但被海報刪除了!多麼可憐!我感謝大家! –

回答

1

最終你的代碼也許應該是這樣的:

enum field_id{ FIELD_ID_1, FIELD_I_2 }; 
enum inner_type_id{ INN_ID_1, INN_ID_2 }; 

template<field_id field_value, inner_type_id inner_type_value> 
//  ^no enum keyword 
struct node 
{ 
    static field_id m_field_id; 
}; 

template<field_id field_value, inner_type_id inner_type_value> 
field_id node<field_value, inner_type_value>::m_field_id = field_value; 
//   ^no enum and type 

int main(){ 
    typedef node<FIELD_ID_1,INN_ID_1> my_type; 
    assert(my_type::m_field_id == FIELD_ID_1); 
    //    ^there's only m_field_id member 
    my_type obj; 
} 
4

enum關鍵字不能模板內出現 - 只使用類型名稱:

template<field_id field_value, inner_type_id inner_type_value> struct ... 
0

爲什麼在靜態變量的實例中重複模板參數的類型?我剛剛寫道:

template <field_id field_value, inner_type_id inner_type_value> 
field_id node <field_value, inner_type_value>::m_field_id = field_value; 

編輯:這與gcc編譯和按預期工作。

1

編輯:發佈一個答案錯了​​。 或者,您可以使靜態字段爲常量並將其定義爲內聯:

template<field_id field_value 
     , inner_type_id inner_type_value 
>struct node{ 
     static const field_id m_field_id=field_value; 
}; 
+0

嗨AndrehJ!你的意思是inlin的結構,對嗎?作爲const +內聯sohuld走得更快..不是嗎?由於它是一個簡短的結構,我認爲gcc在內聯中不會有任何問題。 –

+0

我的意思是在結構體或類體中定義和初始化。它只能使用整型類型的靜態常量成員。使它成爲const可能會讓你的案例更快,使得它在這種情況下內聯可能不會更快,但它可能在其他情況下。無論如何,我提出的原因是簡單性和可讀性,而不是速度。另外,如果在對象的生命週期中該值不應該改變,那麼將成員類型設置爲const是個好主意。 – AndrzejJ