2010-10-21 93 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