在以下设置中,我该如何制作它以便我可以在派生类Bar
中引用名称Derived<T>
?
template <typename T> struct Foo
{
template <typename U> struct Bar { };
};
template <typename T> struct Derived : Foo<T>
{
// what goes here?
Bar<int> x; // Error: 'Bar' does not name a type
};
我试过了using Foo<T>::Bar;
,但这没有用。是否有任何类型的using
声明可以使派生类知道嵌套基本模板的名称,以便我可以保留简单声明Bar<int> x
?
我知道我可以说typename Foo<T>::template Bar<int> x;
,但我有很多这样的情况,而且我不想用这么多的冗长不必要地加重代码。我也有很多不同的“int
s”,因此每个嵌套模板实例的typedef
也是不可行的。
此外,我不能在此时使用GCC 4.7,也不能使用C ++ 11,因此会喜欢没有模板别名的“传统”解决方案。
答案 0 :(得分:6)
在C ++ 11中,您可以使用别名模板:
template <typename T> struct Derived : Foo<T>
{
template<typename X> using Bar = typename Foo<T>::template Bar<X>;
Bar<int> x;
};
修改强>
传统解决方案就是你已经说过的,typename Foo<T>:template Bar<int>
,或模仿“模板typedef”
template <typename T> struct Derived : Foo<T>
{
template<typename X>
struct Bar
{ typedef typename Foo<T>::template Bar<X> type; };
typename Bar<int>::type x;
};
向该语言添加别名模板的原因之一是它们支持无法在C ++ 03中轻松表达的内容。
答案 1 :(得分:1)
将x
声明为Foo<T>::Bar<int> x;
只对我有用。
答案 2 :(得分:0)
这有效:
template <typename T> struct Foo
{
template <typename U> struct Bar { };
};
template <typename T> struct Derived : Foo<T>
{
template<class W>
struct Bar : public Foo<T>::template Bar<W> {
};
Bar<int> x;
};
IDK,如果这是你正在寻找的,但它确实编译。