Как я могу вызвать члена из шаблонного базового класса в шаблонном производном классе?

С этой настройкой:

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

Решение

Исходя из предположения, что ваш код прекрасно компилируется на 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 disambiguator:

d->template Base<E>::foo();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]