A declaração "usando" pode ser usada com modelos?
Pergunta
É possível usar a declaração "usando" com classes base de modelo? Eu li, não é aqui Mas isso é por causa de uma razão técnica ou é contra o padrão C ++ e se aplica ao GCC ou a outros compiladores? Se não é possível, por que não?
Código de exemplo (do link acima):
struct A {
template<class T> void f(T);
};
struct B : A {
using A::f<int>;
};
Solução
O que você vinculou é uma diretiva usando. Uma declaração de uso pode ser usada bem com classes base modeladas (não procurou no padrão, mas apenas o testou com um compilador):
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);
}
O compilador encontra corretamente o parâmetro sem foo
função por causa de nosso uso da declaração, redigindo-a no escopo de c2
, e produz o resultado esperado.
Editar: atualizou a pergunta. Aqui está a resposta atualizada:
O artigo está certo sobre que você não tem permissão para usar um modelo-ID (nome do modelo e argumentos). Mas você pode colocar um nome de modelo:
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);
}