C++ Erreur C2653 de "Classe" n'est pas une classe ou d'un nom d'espace de noms

Bon après-midi. J'ai commencé à apprendre le c++ et je vais avoir des et le problème de la compilation de mon projet.
Si vous trouvez un code défectueux, je serais heureux si vous me dites.

J'ai les définitions suivantes:

Utils.h

#include "stdafx.h"
#include <string>
using namespace std;

class Utils
{
public:
static string GetStringFromInt (int number);
};

Utils.cpp

#include "Utils.h"
#include <sstream>
#include <string>
using namespace std;

 string Utils::GetStringFromInt (int number)
{

    stringstream ss;
    ss << number;
    return ss.str();
}

et

Ping.h

#include "stdafx.h"
#include <string>

using namespace std;

class Ping
{
public:
    static int PingIt(int argc, char* argv[],string &mstime,string &ttl);   
};

Ping.cpp

#include "Ping.h"
#include <string>
#include "icmpdefs.h"
#include <string>
#include <iostream>
#include <sstream>
#include <WinSock.h>
#include <Windows.h>
#include "Utils.h"
#pragma comment(lib,"wsock32.lib")
using namespace std;
int Ping::PingIt(int argc, char* argv[],string &mstime,string &ttl)
{
//Check for correct command-line args
if (argc < 2) {
cerr << "usage: ping <host>" << endl;
return 1;
}
//Load the ICMP.DLL
HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");
if (hIcmp == 0) {
cerr << "Unable to locate ICMP.DLL!" << endl;
return 2;
}
//Look up an IP address for the given host name
struct hostent* phe;
if ((phe = gethostbyname(argv[1])) == 0) {
cerr << "Could not find IP address for " << argv[1] << endl;
return 3;
}
//Get handles to the functions inside ICMP.DLL that we'll need
typedef HANDLE (WINAPI* pfnHV)(VOID);
typedef BOOL (WINAPI* pfnBH)(HANDLE);
typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,
PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); //evil, no?
pfnHV pIcmpCreateFile;
pfnBH pIcmpCloseHandle;
pfnDHDPWPipPDD pIcmpSendEcho;
pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp,
"IcmpCreateFile");
pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp,
"IcmpCloseHandle");
pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp,
"IcmpSendEcho");
if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || 
(pIcmpSendEcho == 0)) {
cerr << "Failed to get proc addr for function." << endl;
return 4;
}
//Open the ping service
HANDLE hIP = pIcmpCreateFile();
if (hIP == INVALID_HANDLE_VALUE) {
cerr << "Unable to open ping service." << endl;
return 5;
}
//Build ping packet
char acPingBuffer[64];
memset(acPingBuffer, '\xAA', sizeof(acPingBuffer));
PIP_ECHO_REPLY pIpe = (PIP_ECHO_REPLY)GlobalAlloc(
GMEM_FIXED | GMEM_ZEROINIT,
sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer));
if (pIpe == 0) {
cerr << "Failed to allocate global ping packet buffer." << endl;
return 6;
}
pIpe->Data = acPingBuffer;
pIpe->DataSize = sizeof(acPingBuffer);      
//Send the ping packet
DWORD dwStatus = pIcmpSendEcho(hIP, *((DWORD*)phe->h_addr_list[0]), 
acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, 
sizeof(IP_ECHO_REPLY) + sizeof(acPingBuffer), 5000);
if (dwStatus != 0) {
cout << "Addr: " <<
int(LOBYTE(LOWORD(pIpe->Address))) << "." <<
int(HIBYTE(LOWORD(pIpe->Address))) << "." <<
int(LOBYTE(HIWORD(pIpe->Address))) << "." <<
int(HIBYTE(HIWORD(pIpe->Address))) << ", " <<
"RTT: " << int(pIpe->RoundTripTime) << "ms, " <<
"TTL: " << int(pIpe->Options.Ttl) << endl;
mstime = Utils::GetStringFromInt((pIpe->RoundTripTime));
ttl = Utils::GetStringFromInt(int(pIpe->Options.Ttl));
}
else {
cerr << "Error obtaining info from ping packet." << endl;
}
//Shut down...
GlobalFree(pIpe);
FreeLibrary(hIcmp);
return dwStatus;
}

Quand je Compile le projet-je obtenir:

Erreur 1 erreur C2653: 'Ping' : n'est pas une classe ou d'un nom d'espace de noms c:\users\clanderasm\documents\visual studio 2010\projects\landetestconsole\landecplusconsole\ping.cpp 14 1 LandeCplusConsole

J'ai lu parfois, cette erreur est levée, car vous n'avez pas include "stdafx.h"
le premier #include mais je l'ai déjà changé.

Si vous pouviez me dire quelque chose de plus, je serais heureux

Existe-il d'autres mises en garde? Peut-être qu'il n'est pas de trouver #include "Ping.h". Aussi, jamais au - using namespace std; dans un en-tête. Jamais.
Re: stdafx.h inclusion. il appartient le premier #inclure dans votre source fichiers; pas vos fichiers d'en-tête. Chaque en-tête de #inclure tout ce qu'il dépend de définitions locales, ou si le fichier de l'indépendance n'est pas nécessaire, ce qui n'est pas déjà tirés par stdafx.h lors de la compilation du compagnon fichier source(s).
Ne pas ne pas trouver Ping.h suite à une erreur plutôt qu'un avertissement?
J'ai travaillé avec les versions de GCC de toute façon, qui ne sera que de les avertir de ne pas trouver un en-tête, ne parviennent pas à sortir lors de l'utilisation de choses de lui. Je ne suis pas certain de ce que MSVC n'est dans ce cas.
En ajoutant à ce que WhosCraig dit, stdafx.h est juste de Visual Studio nom par défaut de l'en-tête inclus dans l'en-tête précompilé. Il n'y a aucune règle en disant qu'il doit être appelé que, pour être inclus dans tout, ou pour qu'elles existent dans un projet C++, c'est juste ce que Visual Studio met en place pour vous par défaut, sauf si vous commencez avec un projet vide. Comme il est inclus dans le PCH, il sera automatiquement inclus dans tous les fichiers sources, mais c'est une bonne pratique manuellement #include quand même - seulement dans les fichiers source plutôt que de les en-têtes.

OriginalL'auteur Carlos Landeras | 2012-11-07