Можно ли использовать объявление using с шаблонами? - PullRequest
6 голосов
/ 06 декабря 2008

Можно ли использовать объявление "using" с базовыми классами шаблона? Я читал, что это не здесь , но по технической причине или против стандарта C ++, и применимо ли это к gcc или другим компиляторам? Если это невозможно, то почему бы и нет?

Пример кода (по ссылке выше):

struct A {
    template<class T> void f(T);
};

struct B : A {
    using A::f<int>;
};

1 Ответ

5 голосов
/ 06 декабря 2008

То, на что вы ссылались, является директивой использования. Декларация 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); 
}
...