4

在以下设置中,我怎样才能使我可以引用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;,但我有很多这样的情况,我不想用这么多冗长不必要地给代码增加负担。我也有很多不同的“ ints”,所以typedef每个嵌套模板实例的一个也不可行。

另外,此时我不能使用 GCC 4.7 也不能使用 C++11,因此我想要一个没有模板别名的“传统”解决方案。

4

3 回答 3

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>,或者模拟“模板类型定义”

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中不容易表达的东西。

于 2012-05-17T18:02:41.463 回答
1

声明xFoo<T>::Bar<int> x;对我有用。

于 2012-05-17T17:50:36.510 回答
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 如果那是您正在寻找的东西,但它确实可以编译。

于 2012-05-17T18:07:23.650 回答