2017-08-24 47 views
4

使用內部類或使用CRTP的枚舉有沒有可能?防爆。使用CRTP的內部類

template<typename Container> 
struct ContainerBase 
{ 
    std::map<typename Container::Enum, int> _; 
}; 
struct ConcreteContainer : ContainerBase<ConcreteContainer> 
{ 
    enum class Enum 
    { 
     left, 
     right 
    }; 
}; 
+0

不,這是不可能的。然而,你的內部類可以簡單地作爲一個獨立類的'typedef',用於繼承,其餘的代碼可以簡單地引用它作爲內部類。 –

+0

我想這隻有當你將枚舉分別傳遞給ContainerBase時纔有效。請參閱http://coliru.stacked-crooked.com/a/48923f15d02fe047 – stefaanv

回答

3

號在類模板派生類還沒有被完全定義(這不是在standardese一個完整的對象)。
In fact(工作草案):

一類是在閉幕式視爲完全定義的對象類型(或完全型)}

因此,你不能指望能夠訪問的一個成員或者你在派生類中從類模板中聲明的內容。

你可以通過單獨傳遞枚舉來解決它,但它需要你在其他地方定義枚舉(另一個基類?外部範圍?無論...)。你可以通過使用traits類來解決問題。等等。
有幾種方法可以做到這一點,但不能直接訪問派生類中定義的枚舉。
這裏是一個可行的解決方案的例子:

#include <map> 

template<typename> struct traits; 

template<typename Container> 
struct ContainerBase 
{ 
    std::map<typename traits<Container>::Enum, int> _; 
}; 

template<> 
struct traits<struct ConcreteContainer> { 
    enum class Enum 
    { 
     left, 
     right 
    }; 
}; 

struct ConcreteContainer : ContainerBase<ConcreteContainer> 
{}; 

int main() { 
    ConcreteContainer cc; 
    cc._[traits<ConcreteContainer>::Enum::left] = 0; 
    cc._[traits<ConcreteContainer>::Enum::right] = 1; 
} 

見它,並在wandbox運行。