Erro “Cout é ambíguo” em C++

Erro Cout E Ambiguo Em C



Este artigo trata de erros ambíguos na linguagem de programação C++. A situação ambígua aparece quando o compilador não consegue determinar os métodos ou operadores a serem usados ​​em diferentes tarefas. Às vezes, usamos a mesma função de parâmetro com o mesmo namespace e então cout é definido em ambos os casos. Quando executamos o programa, o compilador gera o erro cout ambíguo porque o compilador não entende qual significado este código mostra. A ambiguidade cout surge quando existe um conflito entre os namespaces definidos ou múltiplas declarações de funções dentro do programa.

Exemplo 1:

Este é um exemplo de erro ambíguo cout que ocorre principalmente na programação C++. Aqui, veremos como o compilador gera erros ambíguos no cout quando usamos vários namespaces. O trecho de código deste exemplo é mencionado a seguir:







#include

espaço para nome computador portátil {

vazio mostrar ( ) {

padrão :: corte << 'este é o namespace do laptop' << padrão :: fim ;

}

}

espaço para nome móvel {

vazio mostrar ( ) {


padrão :: corte << 'este é o namespace móvel' << padrão :: fim ;

}

}

interno principal ( ) {

usando espaço para nome computador portátil ;
usando espaço para nome móvel ;

mostrar ( ) ;

retornar 0 ;


}

Aqui pegamos um programa com dois namespaces que são definidos de acordo com a nossa necessidade. Queremos exibir as strings na tela. A saída deste código está anexada a seguir:





Após a execução do código, é gerado o erro sobre a situação ambígua. O erro é gerado porque quando o compilador lê o código, o compilador não obtém uma entrada clara do usuário. Usamos várias declarações de namespace em nosso código. Em todo o código, utilizamos o método “display” apenas para exibir a saída na tela. O compilador não tem ideia de qual método de exibição está relacionado a qual namespace. Precisamos tornar o código simples e claro para que o compilador entenda facilmente as etapas sem tornar o código ambíguo.





A solução para esse erro é chamar o método com um namespace relacionado na função principal para que o compilador tenha mais entendimento. Especificamos claramente qual método de namespace queremos chamar em nossa parte de execução principal.

#include

espaço para nome computador portátil {

vazio mostrar ( ) {


padrão :: corte << 'este é o namespace do laptop' << padrão :: fim ;

}

}

espaço para nome móvel {

vazio mostrar ( ) {

padrão :: corte << 'este é o namespace móvel' << padrão :: fim ;

}

}

interno principal ( ) {

usando espaço para nome computador portátil ;
usando espaço para nome móvel ;
computador portátil :: mostrar ( ) ;
retornar 0 ;


}

Aqui, podemos simplesmente vincular o método display() ao namespace “laptop” na função principal, conforme visto na imagem anterior. Agora, execute o programa. A saída é exibida na janela do console.



Exemplo 2:

Este cenário está relacionado ao erro ambíguo cout em C++. O compilador apresenta um erro quando não entende o fluxo de execução. O trecho de código deste exemplo está anexado a seguir:

#include

espaço para nome Clinguagem {

vazio imprimir ( interno eu ) {

padrão :: corte << 'Namespace da linguagem C:' << eu << padrão :: fim ;

}

}

espaço para nome Java {

vazio imprimir ( interno j ) {

padrão :: corte << 'Namespace da linguagem java:' << j << padrão :: fim ;

}

}

usando espaço para nome Clinguagem ;

usando espaço para nome Java ;

interno principal ( ) {

imprimir ( 5 ) ;
retornar 0 ;


}

Neste código, definimos todos os cabeçalhos de biblioteca necessários. Criamos dois namespaces para finalidades diferentes. No namespace “Clinguagem”, definimos um método “print” que obtém o valor inteiro do usuário. Na função “print”, queremos mostrar o valor que o usuário passou na tela do console. Exibimos a saída necessária usando o fluxo “cout” em nosso código. Depois disso, definimos outro namespace cujo nome é “Java”.

Neste namespace “Java”, utilizamos novamente o método “print” para exibir o valor que o usuário passa usando “cout”. Chamamos ambos os namespaces para uso em nossa função principal para obter a saída desejada na janela do console em C++. Na função “main”, chamamos a função sobrecarregada “print()” para mostrar o valor passado na tela do console.

Clique na opção “executar” do menu principal e selecione a opção “compilar e executar”. O erro de ambiguidade ocorre na execução deste código. A captura de tela do erro está anexada da seguinte forma:

Este erro indica que o compilador está confuso sobre a função print() sobrecarregada que é chamada. Este erro está na linha 19, “print (5)”. O compilador está confuso sobre o namespace ao qual esta função sobrecarregada pertence. Os iniciantes estão sempre presos a esses tipos de erros na maioria das vezes.

Vamos resolver esse erro que na verdade não é complexo. Os erros ambíguos são facilmente resolvidos. Devemos especificar o namespace junto com a função sobrecarregada na função “principal” para visibilidade e compreensão do compilador. Como neste programa, adicionamos “java::print(5)” em nosso código existente, conforme mencionado a seguir:

#include

espaço para nome Clinguagem {

vazio imprimir ( interno eu ) {

padrão :: corte << 'Namespace da linguagem C:' << eu << padrão :: fim ;

}

}

espaço para nome Java {

vazio imprimir ( interno j ) {

padrão :: corte << 'Namespace da linguagem java:' << j << padrão :: fim ;

}

}

usando espaço para nome Clinguagem ;

usando espaço para nome Java ;

interno principal ( ) {

Java :: imprimir ( 5 ) ;
retornar 0 ;


}

Agora, o programa é executado perfeitamente sem nenhum erro ambíguo e exibe a saída na tela do console. A saída deste programa está anexada a seguir:

Exemplo 3:

Este é o último e último exemplo relacionado a um erro gerado devido a um problema ambíguo. O compilador não pode obter o resultado correto. O trecho de código deste exemplo está anexado a seguir para melhor compreensão do usuário:

Aqui, definimos as bibliotecas necessárias. Depois disso, definimos um namespace que contém a classe na qual queremos exibir a string na janela do console. Chamamos esse namespace definido na função “principal” com a variável “c”. Depois disso, chamamos o método print() usando um objeto namespace. Exibimos a string novamente na tela do console após a chamada do método. A saída deve ser ambas strings e exibida na tela do console. Quando executamos este código, o erro ocorre conforme mostrado a seguir:

#include

usando espaço para nome padrão ;

espaço para nome meuNamespace {

aula corte {
público :
vazio imprimir ( ) {


corte << 'Cout personalizado' << padrão :: fim ;

}

} ;

}

interno principal ( ) {

meuNamespace :: corte c ;
c. imprimir ( ) ;


corte << 'Olá Mundo!' << padrão :: fim ;

retornar 0 ;

}

O compilador não escolheu a instrução cout que exibe os dados na tela do console. O compilador não consegue entender o namespace que pertence à instrução cout e gera um erro. A solução para esse erro é adicionar um objeto de namespace com uma instrução cout para facilitar a leitura e compreensão do compilador. Adicione “std::” ao longo da instrução cout e execute o código. A seguinte saída é exibida na tela do console:

Conclusão

Aqui, podemos dizer que exibir uma saída na tela do console também gera um erro que não é um erro de sintaxe nem um erro lógico. Na maioria das vezes, o usuário escreve um código com bom senso, mas não é compreensível para o compilador. O compilador é ambíguo quanto à entrada. Portanto, esclareça cada etapa do código com namespace e sintaxe adequados para evitar erros na linguagem de programação C++. As etapas envolvidas na resolução deste problema são o uso de qualificadores explícitos, evitando conflitos de namespace e garantindo que as funções ou objetos pretendidos identifiquem as etapas envolvidas na resolução deste problema.