如何在模板化基类中命名嵌套模板?

时间:2012-05-17 17:40:32

标签: c++ templates base-class name-lookup

在以下设置中,我该如何制作它以便我可以在派生类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,因此会喜欢没有模板别名的“传统”解决方案。

3 个答案:

答案 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,如果这是你正在寻找的,但它确实编译。