嵌套模板类中的模板函数

时间:2012-05-20 20:47:36

标签: c++ templates inner-classes

我在使用的一些代码中遇到了问题。这是我可以创建的最简化的版本:

template <class A>
class Outer {
public:
    template <class B>
    class Inner {
    public:
        template <class C>
        void foo(Outer<C>::Inner<C> innerC) { }
    };

    Inner<A> inner;
};

class X {};
class Y {};

int main() {
    Outer<X> outerX;
    Outer<Y> outerY;
    outerX.foo<Y>(outerY.inner);
}

错误是:

error: expected primary-expression before ">" token

并在编译时在void foo的声明处触发。我的代码有什么不正确的事情呢?

总而言之,我要做的是让嵌套类能够接受任何模板类型的嵌套类 - 但当然嵌套类的模板类型取决于外部类的模板类型,所以我使用::语法,但这会产生错误。

我理解我在这里尝试做的可能不是一个好习惯,但这个问题的目的是更好地理解模板语法。

1 个答案:

答案 0 :(得分:2)

没有从1转换为Inner<C>。这是您的简化测试案例中的错误,还是应该是:

template <class C>
void foo(C innerC) { }

更新:修复代码后,可以看出问题是template之前缺少Inner<C>。否则,编译器将假定Inner是一个值。

template <class C>
void foo(Outer<C>::template Inner<C> innerC) { }