我在使用的一些代码中遇到了问题。这是我可以创建的最简化的版本:
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
的声明处触发。我的代码有什么不正确的事情呢?
总而言之,我要做的是让嵌套类能够接受任何模板类型的嵌套类 - 但当然嵌套类的模板类型取决于外部类的模板类型,所以我使用::
语法,但这会产生错误。
我理解我在这里尝试做的可能不是一个好习惯,但这个问题的目的是更好地理解模板语法。
答案 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) { }