Por doesnt multi Args no trabalho de construtor no Linux?
-
19-08-2019 - |
Pergunta
Para minha classe de exceção que eu tenho um construtor que tem multi argumentos (...) que funciona bem no Windows, como sempre, sob linux ele compila bem, mas recusa-se a ligação a ela.
Por que isso não funciona no Linux?
aqui é um exemplo:
class gcException
{
public:
gcException()
{
//code here
}
gcException(uint32 errId, const char* format = NULL, ...)
{
//code here
}
}
enum
{
ERR_BADCURLHANDLE,
};
.
Editar
Então, quando eu chamá-lo assim:
if(!m_pCurlHandle)
throw gcException(ERR_BADCURLHANDLE);
Eu recebo este erro de compilação:
error: no matching function for call to ‘gcException::gcException(gcException)’
candidates are: gcException::gcException(const gcException*)
gcException::gcException(gcException*)
gcException::gcException(gcException&)
Solução
Ele compila e liga muito bem. I expandiu seu código de teste para um "programa" completo:
class gcException {
public:
gcException() { }
gcException(int errId, const char* format, ...) { }
};
int main() { new gcException(1, "foo", "bar", "baz"); }
e correu então g++ -Wall test.cpp
sem erros. De acordo com g++ -v
, tenho gcc versão 4.3.2 (Debian 4.3.2-1.1). O meu exemplo rápido de compilação para você?
(Você talvez acidentalmente compilar - ou link -? Com ??gcc em vez de g ++)
Outras dicas
O problema é que o construtor de cópia não aceita a temporária que você dê o lance. É uma temporária e, portanto, um rvalue. Uma referência-a-nonconst, nomeadamente gcException&
não pode ligar-se a ele. Leia aqui nos detalhes.
Como um comentário sobre esta resposta sugere, o compilador Microsoft tinha um bug que tornava ligar referências que apontam para objetos não-const aceitar rvalues. Você deve mudar a sua cópia-construtor para isso:
gcException(gcException const& other) {
// ...
}
Para torná-lo trabalho. Ele diz que o bug foi corrigido no Visual C ++ 2005. Portanto, você teria o mesmo problema com essa versão em diante. Então é melhor corrigir esse problema de imediato.
Bem, só percebi isso, parece bloco de código estava usando gcc, em vez de g ++ para compilar o arquivo.