2012-11-29 137 views
0

我遇到一個頭在外部SDK,像這樣:如何初始化靜態const char *枚舉類型traits數組?

// external.h 
// 
template <class T> class MyBaseEnum 
{ 
public: 
    /** String list. */ 
    static const char *mStrings[]; 

    //! Constructor. 
    inline MyBaseEnum(){} 

    //! Destructor. 
    inline ~MyBaseEnum() 
    { 

    } 
}; 

我已經看到了這個類在同一個SDK中使用的另一頭,像這樣:

// foo.h 
// 
class Foo 
{ 
    enum MyEnum 
    { 
     A = 0, 
     B, 
     C 
    }; 
    typedef MyBaseEnum<MyEnum> MyEnumType; 

    MyEnumType bar; 
}; 

我不可以訪問相應的cpp文件來查看mStrings是如何初始化爲bar的,但我認爲這與類型特徵有關。

foo.cpp正確初始化MyEnumType::mStrings的語法如何?

回答

1

由於MyBaseEnum是一個模板類,mStrings成員不能被定義在一個單獨的源文件中。它必須在包含的頭文件中完成,因爲定義需要模板參數。

的語法是基本相同定義任何其他字符串數組:

template<class T> 
const char* MyBaseEnum<T>::mStrings = { ... }; 
+0

我不認爲這是正確的,實際上,我可以在Foo.cpp中定義'mStrings'像這樣:'模板<> const char * MyBaseEnum < MyEnum > :: mStrings [] = {「A」,「B」,「C」};'或'template <> const char * Foo :: MyEnumType :: mStrings []'但爲什麼會foo.h聲明'MyEnumType欄;' –

+0

@PeterMcG MyBaseEnum是否包含您顯示的非靜態成員函數?那麼這可能是一個原因。否則,你必須詢問在「Foo」中添加'bar'成員變量的作者的理由。 –