2010-10-21 92 views
1

基本上這就是我想要做的:類似於使用枚舉的聲明?

struct A { 
    enum E { 
     X, Y, Z 
    }; 
}; 

template <class T> 
struct B { 
    using T::E; 
}; 

// basically "import" the A::E enum into B. 
std::cout << B<A>::X << std::endl; 

之所以是,我想基本上注入的實施細則到我的模板類。同時,「模型」的枚舉反映了我希望用戶能夠爲模板的特定實例化所獲得的信息。這可能嗎?

我知道我可以從A繼承B,但我認爲這不是一個理想的解決方案,因爲我希望能夠在不更改B的膽量的情況下添加新的「模型」。

編輯:現在我已經儘管了,繼承不一定需要排除。或許下面是理想的:

struct A { 
    enum E { 
     X, Y, Z 
    }; 
}; 

template <class T> 
struct B : A { 
}; 

int main() { 
    std::cout << B<A>::X << std::endl; 
} 

回答

2

這個工作對我來說:

struct A { 
    enum E { 
     X, Y, Z 
    }; 
}; 

template <class T> 
struct B { 
    typedef typename T::E E; 
}; 

// basically "import" the A::E enum into B. 
int main(void) 
{ 
    std::cout << B<A>::E::X << std::endl; 
    return 0; 
} 

輸出是

0 

我得到一個警告關於該標準中的非標準延伸因此可能有更優雅的解決方案。

+1

無論如何,在該'cout'語句中擺脫那個中間':: E'? – 2010-10-21 02:16:54

+0

它似乎並沒有與海灣合作委員會4.5.1的工作:'錯誤:'B :: E'不是一個類或命名空間' – 2010-10-21 02:18:22

+0

@Evan - :-)會讓你知道,我想象如此...見編輯版本(最後一行)。我在Visual C++ v10 – 2010-10-21 02:18:34