-1

使用此设置:

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

有什么不同?为什么第二个会导致语法错误?

4

1 回答 1

1

假设您的代码在 Clang 3.2(请参见此处)和 GCC 4.7.2(请参见此处)上编译良好,我看不出使用的理由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();
于 2013-03-04T10:43:50.930 回答