如何在模板化派生类中调用模板化基类中的成员?

时间:2013-03-04 10:27:33

标签: c++ templates name-resolution

使用此设置:

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

有什么区别?为什么第二个导致语法错误?

1 个答案:

答案 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();