Можно ли использовать объявление “using” с шаблонами?
Вопрос
Можно ли использовать объявление "using" с базовыми классами шаблона?Я читал, что это не так здесь но это из-за технической причины или это противоречит стандарту C ++, и применимо ли это к gcc или другим компиляторам?Если это невозможно, то почему бы и нет?
Пример кода (по ссылке выше):
struct A {
template<class T> void f(T);
};
struct B : A {
using A::f<int>;
};
Решение
То, на что вы ссылаетесь, - это директива using .Объявление 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
функция из-за нашего using-declaration, повторно объявляющего ее в области c2
, и выдает ожидаемый результат.
Редактировать:обновил вопрос.вот обновленный ответ:
Статья права в том, что вам не разрешается использовать template-id (имя шаблона и аргументы).Но вы можете указать имя шаблона:
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);
}