Можно ли использовать объявление “using” с шаблонами?

StackOverflow https://stackoverflow.com/questions/346697

  •  19-08-2019
  •  | 
  •  

Вопрос

Можно ли использовать объявление "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); 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top