Como forçar a dedução do argumento do modelo de classe ao construir uma classe em suas próprias funções de membro?
Considere o seguinte código:
struct A {};
template <typename T> struct B
{
B(T) {}
auto foo() {return B(A{});} // error: no matching function for call to 'B<int>::B(A)'
};
auto foo() {return B(A{});} // compiles
int main()
{
foo();
B b(0);
b.foo();
}
Eu entendo porqueB::foo()
não compila: dentro destruct B<T>
, B
(como um nome de classe injetado) significaB<T>
a menos que seja explicitamente usado como modelo. O que, neste caso, impede a dedução do argumento do modelo de classe.
Digamos que não posso fazerauto foo() {return B<A>(A{});}
já que meu código real se baseia em guias de dedução fornecidos pelo usuário um pouco elaborados.
A questão é: como forçar a dedução do argumento do modelo de classe ao construirB
dentro deB::foo
?
Espero não estar perdendo algo óbvio.