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>;
};
Foi útil?

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); 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top