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
#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
Vous devez vous connecter pour publier un commentaire.
Je n'arrivais pas à reproduire ton erreur avec le code que vous avez donné, mais j'ai essayé sur VS2008 et certains de l'avertissement, il a soulevé de me faire penser qu'il pourrait très bien être dû à votre en-tête précompilé n'étant pas inclus dans les sources. Et il ya une couple d'autres problèmes que je peux voir qui va certainement vous causer des problèmes plus tard:
De ne pas inclure un en-tête précompilé .h. (Eh bien, vous devriez éviter d'inclure quoi que ce soit dans votre .h, sauf si absolument nécessaire). L'en-tête précompilé (au moins dans visual façon de faire les choses) est destiné à être inclus en premier dans chaque fichiers cpp (pas .h). Si vous ne le faites pas, il va augmenter les avertissements pour chacun comprend que vous avez comme:
avertissement C4627: '#include "de Ping.h"': ignorés lors de la recherche d'un en-tête précompilé utiliser <- vous pouvez y aller votre classe Point n'est plus défini!
et enfin une erreur erreur fatale C1010: fin de fichier inattendue alors que la recherche d'un en-tête précompilé. Vous avez oublié d'ajouter " #include "stdafx.h"' de votre source?.
C'est en fait des messages que je reçois lors de la compilation de votre code sur VS2008, peut-être sur VS2010 vous avez votre erreur sur le Point de ne pas être défini en plus de ceux-ci. Lorsque le tri d'en-tête précompilé problèmes, il compile très bien (voir le point suivant)
À l'aide d'un en-tête précompilé ne signifie pas la .h utilisé pour construire, sera automatiquement inclus dans toutes vos sources. Pour ce faire, vous devez modifier certains paramètre de projet: clic droit sur votre projet -> Propriétés, dans le panneau de gauche, développez Propriétés de Configuration -> C/C++ -> Avancé. Ici, sur la liste sur la droite, vous devriez voir Force Comprend. Tapez ici stdafx.h, et voilà, vous n'aurez pas à le mettre manuellement dans chaque nouvelle .rpc que vous ajoutez à votre projet. Méfiez-vous de ce que vous avez à faire pour toute la configuration (zone de liste déroulante dans le top écrit "Configuration : Active(Debug)"
Excuses, encore une VS2008 écran, l'espoir c'est la même chose sur VS2010
Vous pouvez le faire de 2 façons: la définition de la méthode et de la pragma once méthode.
Le pragma une fois n'est pas standard, mais compile plus vite sur les Visuels, de sorte que vous pouvez éventuellement mélanger les 2 façons.
myheader.h l'aide de pragma fois:
myheader.h en utilisant définit:
myheader.h en utilisant à la fois:
OriginalL'auteur Chris R.