使用此设置:
template<int N>
struct Base {
void foo();
};
class Derived : Base<1> {
static void bar(Derived *d) {
//No syntax errors here
d->Base<1>::foo();
}
};
一切正常。但是,举个例子:
template<class E>
struct Base {
void foo();
};
template<class E>
class Derived : Base<E> {
static void bar(Derived<E> *d) {
//syntax errors here
d->Base<E>::foo();
}
};
我明白了:
error: expected primary-expression before '>' token
error: '::foo' has not been declared
有什么区别?为什么第二个导致语法错误?
答案 0 :(得分:1)
前提是你的代码在Clang 3.2(见here)和GCC 4.7.2(见here)上编译得很好,我没有看到使用Base<E>::
的原因:只需使用d->foo()
:
template<class E>
struct Base {
void foo() { }
};
template<class E>
struct Derived : Base<E> {
static void bar(Derived<E> *d) {
//syntax errors here
d->foo();
}
};
int main()
{
Derived<int> d;
Derived<int>::bar(&d);
}
或者,您可以尝试使用template
消歧器:
d->template Base<E>::foo();