Eu tenho uma função sobrecarregada. 2 das sobrecargas são
void foo(std::string_view v);
void foo(MyClass m);
De onde MyClass
vem um construtor de conversão do std::string
. Como posso forçar uma chamada para foo(std::string{})
ligar para a primeira? No momento ele não compila com erro:
erro: a chamada de 'foo(std::__cxx11::basic_string&)' sobrecarregado é ambígua
Você pode tornar o construtor explícito
ou lançar o argumento
ou lançar um ponteiro para a função
você pode fazer a sobrecarga que deve ter uma classificação inferior em uma função de modelo
A lista não está completa. A primeira opção deve ser preferida, porque geralmente as conversões implícitas devem ser evitadas. Observe a diferença das abordagens acima. Tornar o construtor explícito faz com que apenas uma das duas sobrecargas seja viável. As conversões selecionam explicitamente uma das duas sobrecargas (de outra forma igualmente boas). Eventualmente, transformar a outra sobrecarga em um modelo mantém ambas as sobrecargas como alternativas, mas torna a desejada classificada melhor para resolução de sobrecarga.
Basta adicionar mais uma sobrecarga que usa
static_cast
para chamar astring_view
sobrecarga conforme mostrado abaixo:Demonstração