Advertencia del compilador (nivel 3) C4267
Actualización: noviembre 2007
Mensaje de error
'var': conversión de 'size_t' a 'tipo', posible pérdida de datos
'var' : conversion from 'size_t' to 'type', possible loss of data
Cuando se compila con /Wp64, o cuando se compila en un sistema operativo de 64 bits, el tipo es de 32 bits, pero size_t es de 64 bits cuando se compila para destinos de 64 bits.
Para corregir esta advertencia, utilice size_ten lugar de un tipo.
Ejemplo
El ejemplo siguiente genera el error C4267.
// C4267.cpp
// compile with: /W3 /Wp64
#include <Windows.h>
void Func(int i) {}
void Func2(DWORD i) {}
void Func3(size_t i) {}
int main() {
size_t bufferSize = 10;
Func(bufferSize); // C4267
Func2(bufferSize); // C4267
Func3(bufferSize); // OK
}
La advertencia C4267 también puede aparecer en x86 y no se puede resolver en código, pero se puede omitir y suprimir con el pragma warning.
En esta situación, la advertencia C4267 está provocada por una limitación en las advertencias de /Wp64. En x86, std::cout<<range_index se resuelve como la sobrecarga de operator<< que acepta un unsigned int, ya que size_t es un unsigned int en Win32. La advertencia C4267 se produce porque se ha pasado un valor size_t como argumento unsigned int, lo que puede provocar truncamiento en Win64, donde size_t es de 64 bits, pero unsigned int sigue siendo de 32 bits. En este caso, se puede omitir, porque si se ha compilado para Win64, std::cout<<range_index se resolverá como la sobrecarga de operator<< que acepta un unsigned __int64, ya que eso es lo que es el tipo size_t en Win64. El compilador de 32 bits no lo percibe, y por eso advierte.
El ejemplo siguiente genera el error C4267.
// C4267_b.cpp
// compile with: /W3 /Wp64 /EHsc
// processor: x86
#include <fstream>
#include <vector>
using namespace std;
int main() {
ofstream outputfile;
vector<char> vecbuffer(10);
outputfile.write( &vecbuffer[0], vecbuffer.size() ); // C4267
}