Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
o uso não portátil da classe 'type' como um argumento para uma função variadic
Comentários
Classes ou structs que são passados para uma função variádica precisam ser facilmente copiáveis. Ao passar esses objetos, o compilador simplesmente faz uma cópia bit a bit e não chama o construtor nem o destruidor.
Esse aviso está disponível no Visual Studio 2017 e posteriores.
Exemplo
O exemplo a seguir gera C4840 e mostra como corrigi-lo:
// C4840.cpp
// compile by using: cl /EHsc /W4 C4840.cpp
#include <stdio.h>
int main()
{
struct S {
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
operator int() { return i; }
private:
int i;
} s(0);
printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
// as an argument to a variadic function
// To correct the error, you can perform a static cast
// to convert the object before passing it:
printf("%i\n", static_cast<int>(s));
}
Para cadeias de caracteres criadas e gerenciadas usando o CStringW, o operator LPCWSTR() fornecido deve ser usado para converter um objeto CStringW no ponteiro de estilo C esperado pela cadeia de caracteres de formato:
CStringW str1;
CStringW str2;
// ...
str1.Format("%s", static_cast<LPCWSTR>(str2));