'未在此范围内声明"C++

' was not declared in this scope' C++

本文关键字:范围内 声明 C++      更新时间:2023-10-16

我有一些粗鲁的错误…我在网上搜索了一下,我可以在任何地方读到她,但仍然没有解决我的问题…

这是我的main:

#include <iostream>
#include "SFML/Network.hpp"
#include "decode.hpp"
#include "listOfFunction.hpp"
#include "map.hpp"
void createSocket(){
    unsigned short bindPort = 12800;
    unsigned short clientPort;
    int ret = 0;
    sf::UdpSocket socket;
    sf::IpAddress clientAddr;
    sf::Packet packet;
    Map mainMap;
    if (socket.bind(bindPort) != sf::Socket::Done){
        if (sf::Socket::Error) std::cout << "An unexpected error happened : Fatal Error !" << std::endl;
        if (sf::Socket::NotReady) std::cout << "The socket is not ready to send/receive data yet !" << std::endl;
    }
    while(1){
        packet.clear();
        socket.receive(packet, clientAddr, clientPort);
        std::string header = readFromPacket(packet);
        ret = callFunction(packet, header, clientAddr, clientPort, mainMap, socket);
    }
}
int main(){
    createSocket();
}

错误如下:

错误:'Map'未在此范围内声明错误:期望在"mainMap"之前有";"错误:'mainMap'未在此范围内声明

没有在此范围内声明callFunction

Map.cpp:

#include <iostream>
#include <vector>
#include "SFML/Network.hpp"
#include "map.hpp"
Map::Map(){
    char number[5] = "";
    int m_obstacle[80000] = {0};
    std::string m_error = "not error";
    std::vector <int> m_posPlayer(0);
    std::vector <std::string> m_namePlayer(0);
    std::vector <sf::IpAddress> m_addressPlayer(0);
    std::string m_stringObstacle = "";
    for (int i=0;i<80000;i++){
        sprintf(number, "%d", m_obstacle[i]);
        m_stringObstacle += std::string(number) + "+";
    }
}
int Map::sendMap(sf::IpAddress address, unsigned short clientPort, sf::UdpSocket& socket){
    std::string header = "rcv_map";
    sf::Packet packet;
    packet >> header >> m_stringObstacle;
    if(socket.send(packet, address, clientPort)!=sf::UdpSocket::Done){
        m_error += "Error sending the packet n";
    }
    return 0;
}
int Map::error(){
    if (m_error != "not_error"){
        std::cout << "here is a following list of errors : " << m_error << std::endl;
    }
    m_error.erase(0,m_error.length());
}

Map.hpp:

#include <iostream>
#include "SFML/Network.hpp"
#ifndef DECODE_H_INCLUDED
#define DECODE_H_INCLUDED
class Map{
    public:
        Map();
        int sendMap(sf::IpAddress address, unsigned short clientPort, sf::UdpSocket& socket);
        int error();
    private:
        int m_obstacle;
        std::vector <int> m_posPlayer;
        std::vector <int> m_namePlayer;
        std::vector <sf::IpAddress> m_addressPlayer;
        std::string m_stringObstacle;
};
#endif // DECODE_H_INCLUDED

问题可能出在标题部分,但是我不知道是怎么回事

问题可能是关于标题,但找不到原因。

完全正确!您错误地应用包含保护

您从错误的hpp文件中使用了包含保护:

#ifndef DECODE_H_INCLUDED
map.hpp中的

来源于decode.hpp。应该是

#ifndef MAP_H_INCLUDED

我认为问题与Map.hpp中的这些宏定义有关

#ifndef DECODE_H_INCLUDED
#define DECODE_H_INCLUDED

似乎它们与Map.hpp之前包含的decode.hpp中使用的定义相同

考虑到至少这个构造函数是错误的,没有意义,不会编译

Map::Map(){
    int i = 0;
    int m_obstacle[80000] = {0};
    std::vector <int> m_posPlayer(0);
    std::vector <std::string> m_namePlayer(0);
    std::vector <sf::IpAddress> m_addressPlayer(0);
    std::string m_stringObstacle = "";
    for (i=0;i<80000;i++){
        m_stringObstacle += m_obstacle[i] + "+";
   }
}

这些局部对象

    std::vector <int> m_posPlayer(0);
    std::vector <std::string> m_namePlayer(0);
    std::vector <sf::IpAddress> m_addressPlayer(0);
    std::string m_stringObstacle = "";

不被使用。我想你指的是类数据成员而不是局部对象:)

和这个语句

    m_stringObstacle += m_obstacle[i] + "+";

是错误的,没有意义。

也是数据成员

int m_obstacle;

被声明为标量对象。不能像在数组中那样在构造函数中重新声明它。