То, на что вы ссылались, является директивой использования. Декларация using может прекрасно использоваться с шаблонными базовыми классами (в стандарте его не искали, а просто протестировали с помощью компилятора):
template<typename T> struct c1 {
void foo() { std::cout << "empty" << std::endl; }
};
template<typename T> struct c2 : c1<T> {
using c1<T>::foo;
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2<void> c;
c.foo();
c.foo(10);
}
Компилятор правильно находит функцию foo
без параметров, поскольку наше объявление об использовании повторно объявляет ее в области действия c2
и выводит ожидаемый результат.
Редактировать : обновлен вопрос. вот обновленный ответ:
В статье говорится, что вам не разрешено использовать идентификатор шаблона (имя шаблона и аргументы). Но вы можете поставить имя шаблона:
struct c1 {
template<int> void foo() { std::cout << "empty" << std::endl; }
};
struct c2 : c1 {
using c1::foo; // using c1::foo<10> is not valid
void foo(int) { std::cout << "int" << std::endl; }
};
int main() {
c2 c;
c.foo<10>();
c.foo(10);
}