Ошибка C++ C2653 "Class" не является именем класса или пространства имен
Добрый день. Я начал изучать c++ , и у меня есть и проблема компиляции моего проекта. Если вы нашли неисправный код, я буду рад, если вы мне.
у меня есть следующие определения:
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();
}
и
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;
}
когда я компилирую проект I получить:
Ошибка 1 ошибка C2653: "Ping": не является именем класса или пространства имен c:usersclanderasmdocumentsvisual студия 2010проектыlandetestconsolelandecplusconsoleping.cpp 14 1 LandeCplusConsole
Я читал, иногда эта ошибка возникает, потому что вы не включаете "stdafx.ч" на первом #include, но я уже изменил его.
если бы вы могли сказать мне что-то еще, я был бы рад
1 ответов
Я не мог воспроизвести вашу ошибку с кодом, который вы дали, но я попробовал VS2008, и некоторые из предупреждений, которые он поднял, заставляют меня думать, что это может быть связано с тем, что ваш предварительно скомпилированный заголовок не включен в источники. И есть несколько других проблем, которые я вижу, что, безусловно, вызовет у вас проблемы позже:
-
не включайте предварительно скомпилированный заголовок .h. (Ну, вы должны даже избегать включения чего-либо в свой .h если это не абсолютно необходимо). Этот предварительно скомпилированный заголовок (по крайней мере, визуальным способом) должен быть включен первым в каждый cpp-файл (нет .ч.) Если вы этого не сделаете, это вызовет предупреждения для каждого из вас:
предупреждение C4627: '#include " Ping.h"': пропущено при поиске предварительно скомпилированного заголовка use
и, наконец, ошибка фатальная ошибка C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Вы забыли добавить "#include " stdafx.ч"' на ваш источник?.
это на самом деле сообщения, которые я получаю при компиляции кода на VS2008, возможно, на VS2010 у вас есть ошибка о том, что точка не определяется в дополнение к ним. При сортировке предварительно скомпилированных проблем заголовка он компилируется отлично (см. Следующий пункт)
использование предварительно скомпилированного заголовка не означает.h используется для его создания, будет автоматически включен во все ваши источники. Чтобы сделать это, вы должны изменить некоторые настройка проекта:щелкните правой кнопкой мыши о проекте -> свойства в левой панели разверните Свойства Конфигурации - > C / C++ - > Дополнительно. Здесь в списке справа вы должны увидеть Группа Включает В Себя. Типа вот файл stdafx.h, И вуаля, вам не придется вручную вставлять его в каждый новый .СРР вы добавляете в свой проект. Помните, что вы должны сделать это для всех конфигураций (поле со списком вверху написано "настройки : Active (Debug)"
извинения, все еще экран VS2008, надеюсь, что это то же самое на VS2010
- охраняйте свои заголовки. Вы должны поместить gards в свои заголовки, чтобы избежать нескольких определений ваших классов, когда несколько включают одно и то же .h случается (и будет). Вы можете сделать это 2 способами:Метод define и метод pragma once. Pragma once не является стандартной, но компилируется быстрее на Visual, поэтому вы можете в конечном итоге смешать 2 пути.
myheader.h использование pragma один раз:
#pragma once
class MyClass
{
//<some definitions>
};
myheader.H использование определяет:
#ifndef __MYHEADER_H
#define __MYHEADER_H
class MyClass
{
//<some definitions>
};
#endif
myheader.h используя оба:
#pragma once
#ifndef __MYHEADER_H
#define __MYHEADER_H
class MyClass
{
//<some definitions>
};
#endif
- это уже было сказано, но избегайте использования "using" в заголовках, потому что он будет распространяться. Я сам избегаю использования" использования " везде.