2016-01-19 5 views
0

Почему это в файле Client.cpp Я получаю сообщение об ошибке C2065: «TunnelContainer»: undefined identifier?VC++ необъявленный идентификатор

client.cpp код:

#include "stdafx.h" 
#include "GClientLib.h" 

using namespace GClientLib; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SettingsReader^ settings = gcnew SettingsReader(); 
    SocketToObjectContainer^ STOContainer = gcnew SocketToObjectContainer(); 
    TunnelContainer^ tunnels = gcnew TunnelContainer(); 

    timeval time; 
    time.tv_sec = 0; 
    time.tv_usec = 300000; 
.... 

GClientLib.h фрагмент кода:

#include "Structures.h" 
#include "Globals.h" 
#include "SettingsReader.h" 
#include "SocketToObjectContainer.h" 
#include "SocketToSocketContainer.h" 
#include "TunnelContainer.h" 

Обновлено. SocketToSocketContainer.h

#ifndef SocketToSocketContainer_H 
#define SocketToSocketContainer_H 

#include <cliext/utility> 
#include <cliext/list> 
#include <cliext/algorithm> 

namespace GClientLib { 
    ref class SocketToSocketContainer { 
     private: 
      cliext::list<cliext::pair<int, int>> sarasas; 
     public: 
      SocketToSocketContainer(void); 
      void Add(int, int); 
      int Find(int); 
      void Delete(int); 
    }; 
}; 
#endif 

GclientLib является Lib проект, используемый в клиентском приложении. Опираться на Visual Studio 2013 C++/CLI включена

TunnelContainer.h код:

#ifndef GClientLib_H 
#define GClientLib_H 

#include <cliext/utility> 
#include <cliext/list> 
#include <cliext/algorithm> 

namespace GClientLib { 
    enum TunnelStatus 
    { 
     JUNGIASI = 1, //Uzmezgamas rysys tarp klientu 
     LAUKIA_PROGRAMOS = 2, // Laukia kol prisijungs norima kliento porgramine iranga 
     KOMUNIKACIJA = 3 // Tuneliu vyksta komunikacija 
    }; 

    ref struct Tunnel 
    { 
     int tag;  //Tunelio zyme 
     int dport;  //Prievadas, prie kurio jungesi 
     int clientid; //Kliento ID su kuriuo sujungta 
     int sport;  //Vietinis prievadas 
     int serverSocket; //Socketas, prie kuris priima duomenu srauta 
     int status;  // Sujungimo statusas (Jungiasi, prisjungta, laukia jungties) 
    }; 

    ref class TunnelContainer { 
    private: 
     // Tuneliu sarasas 
     cliext::list<cliext::pair<int, Tunnel^>> sarasas; 
    public: 
     // Konstruktorius 
     TunnelContainer(); 
     // Pridedamas naujas tunelis. PERRASO statusa i JUNGIAMASI 
     Tunnel^ Add(Tunnel^ tunelis); 
     // Pridedamas naujas tunelis. Statusa nustato i JUNGIAMASI 
     Tunnel^ Add(int tag, int dport, int clientid, int sport, int serverSocket); 
     // Tunelio paieska pagal tag 
     Tunnel^ Find(int tag); 
     // Salina tuneli pagal tag 
     Tunnel^ Remove(int tag); 
     // Keicia tunelio statusa 
     void ChangeStatus(int tag, TunnelStatus status); 
    }; 
}; 
#endif 

UPDATE

После переезда TunnelContainer.h в первую позицию получаю эту ошибку в ToServerSocket.h файле:

Error 1 error C2143: syntax error : missing ';' before '^' line 16 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int line 16 

код ToServerSocket.h:

#ifndef ToServerSocket_H 
#define ToServerSocket_H 

#include <iostream> 

#include "gNetSocket.h" 
#include "ServerSocket.h" 
#include "OutboundSocket.h" 

namespace GClientLib { 
    ref class ToServerSocket : public gNetSocket { 
     private: 
      char *commandBuffer; 
line 16 --->TagGenerator^ tag; 
      SocketToObjectContainer^ STOC; 
      SettingsReader^ settings; 
     public: 
      ToServerSocket(string ip, string port, fd_set* skaitomiSocket, fd_set* rasomiSocket, fd_set* klaidingiSocket, SocketToObjectContainer^ STOC, SettingsReader^ settings); 
      virtual int Send(char* data, int lenght) override; 
      virtual void Recive(SocketToObjectContainer^ container) override; 
      virtual void Connect() override; 
      virtual void Reconnect() override; 
      void CommandList(int page); 
      void CommandListAck(int rRecv); 
      void CommandHello(); 
      void CommandHelp(); 
      void CommandInitConnect(int id, int port, SocketToObjectContainer^ container); 
      void CommandConnect(SocketToObjectContainer^ container); 
      void CommandClear(); 
      void CommandBeginRead(SocketToObjectContainer^ container); 
      void CommandClientConnectAck(SocketToObjectContainer^ container); 
      void CommandInitConnectAck(); 
      void CommandJsonList(int page, SOCKET socket); 
      void CommandJsonListAck(int rRecv, SocketToObjectContainer^ container); 
      void CommandJsonInitConnect(int id, int port, SOCKET socket); 
      void CommandJSONConnect(SocketToObjectContainer^ container); 
      void CommandJsonInitConnectAck(); 
      int GenerateTag(); 
    }; 
}; 

#endif 
+0

В Client.cpp, когда я ввожу предложения GClientLib, также не отображается TunnelContainer, проверенное событие включается непосредственно в Cleint.cpp – gedO

+0

[MCVE], как обычно, пожалуйста. В противном случае диагноз невозможен. –

+0

Как выглядит TunnelContainer.h? – 1201ProgramAlarm

ответ

1

у вас, вероятно, есть синтаксическая ошибка или отсутствует ; или отсутствует закрытие " в включении до этого, "SocketToSocketContainer.h".

#include - это оператор прекомпилятора, все, что он делает, включает содержимое данного файла в основной файл; ваша задача - убедиться, что результат является допустимым кодом. Поэтому, если у одного из них есть неполное утверждение, содержимое второго включает этот оператор.

Edit: Это может быть еще дальше в списке - любое открытое или неправильное #ifdef в любой включаемый может удалить весь отдых

+0

Я разместил код SocketToSocketContainer.h. Проект строится успешно. Я не нашел никаких ошибок – gedO

+0

Я переехал TunnelContainer.h включить в первую позицию. Ошибка изменилась. Проводка в вопросе – gedO

0

Я нашел мою ошибку. GClientLib_H уже определен.

#ifndef GClientLib_H 
#define GClientLib_H 

Изменен

#ifndef TunnelContainer_H 
#define TunnelContainer_H 

Теперь все работает. Спасибо за быстрые ответы

Смежные вопросы