Ambiguidade na hora de compilar o p7zip com make 7zG [RESOLVIDO]

1. Ambiguidade na hora de compilar o p7zip com make 7zG [RESOLVIDO]

Mauricio Ferrari
maurixnovatrento

(usa Slackware)

Enviado em 25/08/2021 - 21:09h

Alguém com mais experiência em c/c++ poderia me ajudar a resolver esse tipo de ambiguidade? Eu tento compilar o p7zip e dá esse erro.

g++ -c -std=gnu++11 -I. -I../../../../C -I../../../../CPP/myWindows -I../../../../CPP/include_windows -I../../../../CPP -O2 -s -pipe -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DNDEBUG -D_REENTRANT -DENV_UNIX -D_7ZIP_LARGE_PAGES `wx-config --unicode=yes --cxxflags` -DLANG -DEXTERNAL_CODECS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_REENTRANT -DENV_UNIX -DUNICODE -D_UNICODE -DUNIX_USE_WIN_FILE   ../../../../CPP/Windows/Control/Controls.cpp
../../../../CPP/Windows/Control/Controls.cpp: In member function 'virtual bool NWindows::NControl::CDialogChildControl::GetText(CSysString&)':
../../../../CPP/Windows/Control/Controls.cpp:86:17: error: ambiguous overload for 'operator=' (operand types are 'CSysString' {aka 'UString'} and 'wxString')
86 | s = str;
| ^~~
In file included from ../../../../CPP/myWindows/StdAfx.h:20,
from ../../../../CPP/Windows/Control/Controls.cpp:3:
../../../../CPP/Common/MyString.h:526:12: note: candidate: 'UString& UString::operator=(const wchar_t*)'
526 | UString &operator=(const wchar_t *s);
| ^~~~~~~~
../../../../CPP/Common/MyString.h:529:12: note: candidate: 'UString& UString::operator=(const char*)'
529 | UString &operator=(const char *s);
| ^~~~~~~~
../../../../CPP/Windows/Control/Controls.cpp: In member function 'void NWindows::NControl::CComboBox::GetText(CSysString&)':
../../../../CPP/Windows/Control/Controls.cpp:125:21: error: ambiguous overload for 'operator=' (operand types are 'CSysString' {aka 'UString'} and 'wxString')
125 | s = str;
| ^~~
In file included from ../../../../CPP/myWindows/StdAfx.h:20,
from ../../../../CPP/Windows/Control/Controls.cpp:3:
../../../../CPP/Common/MyString.h:526:12: note: candidate: 'UString& UString::operator=(const wchar_t*)'
526 | UString &operator=(const wchar_t *s);
| ^~~~~~~~
../../../../CPP/Common/MyString.h:529:12: note: candidate: 'UString& UString::operator=(const char*)'
529 | UString &operator=(const char *s);
| ^~~~~~~~
../../../../CPP/Windows/Control/Controls.cpp: In member function 'void NWindows::NControl::CComboBox::GetLBText(int, CSysString&)':
../../../../CPP/Windows/Control/Controls.cpp:136:21: error: ambiguous overload for 'operator=' (operand types are 'CSysString' {aka 'UString'} and 'wxString')
136 | s = str;
| ^~~
In file included from ../../../../CPP/myWindows/StdAfx.h:20,
from ../../../../CPP/Windows/Control/Controls.cpp:3:
../../../../CPP/Common/MyString.h:526:12: note: candidate: 'UString& UString::operator=(const wchar_t*)'
526 | UString &operator=(const wchar_t *s);
| ^~~~~~~~
../../../../CPP/Common/MyString.h:529:12: note: candidate: 'UString& UString::operator=(const char*)'
529 | UString &operator=(const char *s);
| ^~~~~~~~
../../../../CPP/Windows/Control/Controls.cpp: In member function 'virtual bool NWindows::NControl::CEdit::GetText(CSysString&)':
../../../../CPP/Windows/Control/Controls.cpp:211:17: error: ambiguous overload for 'operator=' (operand types are 'CSysString' {aka 'UString'} and 'wxString')
211 | s = str;
| ^~~
In file included from ../../../../CPP/myWindows/StdAfx.h:20,
from ../../../../CPP/Windows/Control/Controls.cpp:3:
../../../../CPP/Common/MyString.h:526:12: note: candidate: 'UString& UString::operator=(const wchar_t*)'
526 | UString &operator=(const wchar_t *s);
| ^~~~~~~~
../../../../CPP/Common/MyString.h:529:12: note: candidate: 'UString& UString::operator=(const char*)'
529 | UString &operator=(const char *s);
| ^~~~~~~~
make[1]: *** [makefile.list:285: Controls.o] Erro 1
make[1]: Saindo do diretório '/home/mauricio/BUILDS/Slackware_15_0/p7zip/p7zip-17.04/CPP/7zip/UI/GUI'

make: *** [makefile:55: 7zG] Erro 2


Se alguém puder me ajudar, ficarei grato.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/08/2021 - 08:34h

Ao que parece, o programa está tentando converter, por meio de uma atribuição, um dado do tipo wxString em um dado do tipo UString mas parece também que não existe uma conversão direta entre esses tipos, mas que existem duas conversões conhecidas que poderiam ser usadas como intermediárias, entretanto o compilador não consegue decidir qual das duas usar.

O seguinte código ilustra a situação, produzindo um problema semelhante.
class X {
public:
// Habilita conversões implíticas de X para ponteiro para caracteres e ponteiros para caracteres largos.
operator const char *() const;
operator const wchar_t *() const;
};

class Y {
public:
// Permite fazer atribuições a partir de ponteiros para caracteres ou ponteiros para caracteres largos.
Y &operator=(const char *);
Y &operator=(const wchar_t *);
};


void f(){
X x;
Y y;

// Não existe conversão direta de X para Y, então o compilador tenta usar as conversões conhecidas, mas encontra duas igualmente válidas,
// e não sabe dizer qual das duas deve ser usada. Vai dar a mesma mensagem de erro que você recebeu.
y=x;
}


No caso acima, duas maneiras de eliminar a ambiguidade seriam comentar uma das funções dentro da classe X que faz a conversão de X para const char * ou para const wchar_t * ou comentar uma das funções de atribuição da classe Y a partir do tipo de ponteiro que não lhe interessar.

No seu caso, porém, as classes envolvidas não foram desenvolvidas por você, e talvez sejam parte de alguma biblioteca do sistema na qual não seria muito prudente mexer, a fim de não quebrar outras coisas. Então uma outra forma de desfazer a ambiguidade por conta de várias possibilidades de conversão para tipos intermediários é explicitar o tipo intermediário que deve ser usado.

No trecho ilustrativo que eu usei acima, isso poderia ser feito trocando a linha “y=x;” por “y=static_cast<const char *>(x);” ou “y=static_cast<const wchar_t *>(x);”.

Já no caso do seu programa, a solução seria praticamente idêntica: trocar nas linhas 86, 125, 136 e 211 do arquivo Controls.cpp a expressão “s=str;” por “s=static_cast<const char *>(str);” ou por “s=static_cast<const wchar_t *>(str);”. Não sei dizer qual das duas seria mais conveniente, mas acho que qualquer uma das duas produzirá resultados equivalentes. Convém olhar a documentação de wxString e ver se existe alguma diferença relevante, que justifique preferir uma ou outra.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Ambiguidade na hora de compilar o p7zip com make 7zG [RESOLVIDO]

Mauricio Ferrari
maurixnovatrento

(usa Slackware)

Enviado em 26/08/2021 - 14:02h


Obrigado pela resposta. Funcionou perfeitamente.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts