0

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

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。导致这种情况发生的我的代码有什么不正确的地方?

换句话说,我想要做的是让嵌套类能够接受具有任何模板类型的嵌套类 - 但当然嵌套类的模板类型取决于外部类的模板类型,所以我使用::语法,但是这给出了一个错误。

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

4

1 回答 1

2

没有从1到的转换Inner<C>。这是您减少的测试用例中的错误,还是应该是:

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

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

template <class C>
void foo(Outer<C>::template Inner<C> innerC) { }
于 2012-05-20T20:51:15.743 回答