2011-01-07 4 views
0

아마도 지나치게 야심을 가졌지 만 QLocalSockets 및 QTcpSocket을 통한 연결을 허용 할 수있는 서버 프로그램을 작성하려고합니다. 개념은 QLocalServer와 QTcpServer 모두가 새로운 연결을 수신와 '넥서스'객체를하는 것입니다 : 생성자 QIODevice에 대한 포인터를 취하는 서버 개체를 설정QIODevice를 기대하는 메소드에 QLocalSocket * 전달 *

Nexus::Nexus(QObject *parent) 
     : QObject(parent) 
    { 
     // Establish a QLocalServer to deal with local connection requests: 
     localServer = new QLocalServer; 

     connect(localServer, SIGNAL(newConnection()), 
       this,  SLOT(newLocalConnection())); 
     localServer -> listen("CalculationServer"); 


     // Establish a UDP socket to deal with discovery requests: 
     udpServer = new QUdpSocket(this); 
     udpServer -> bind(QHostAddress::Any, SERVER_DISCOVERY_PORT); 
     connect(udpServer, SIGNAL(readyRead()), 
       this,  SLOT(beDiscovered())); 

     // Establish a QTcpServer to deal with remote connection requests: 
     tcpServer = new QTcpServer; 

     connect(tcpServer, SIGNAL(newConnection()), 
       this,  SLOT(newTcpConnection())); 
     tcpServer -> listen(QHostAddress::Any, SERVER_COMMAND_PORT); 
    } 

... 그리고 별도의 슬롯. 이론적으로이 은 QLocalSocket과 QTcpSocket이 모두 QIODevice를 상속하기 때문에이 작동해야합니다. 여기에 예를 들어 newLocalConnection 슬롯입니다 :

void Nexus::newLocalConnection() 
{ 
    // Create a new CalculationServer connected to the newly-created local socket: 
    serverList.append(new CalculationServer(localServer -> nextPendingConnection())); 

    // We don't allow more than one local connection, so stop listening on the server: 
    localServer -> close(); 
} 

문제는이 오류주고, 컴파일되지 것입니다 : 유형이 명확 하지 관련이없는가 가리키는 지금

error C2664: 'CalculationServer::CalculationServer(QIODevice *,QObject *)' : cannot convert parameter 1 from 'QLocalSocket *' to 'QIODevice *' 1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

및 다른 곳에서 내 코드에서 내가 좋아하는 행동에 전혀 문제가 없습니다 :

QLocalSocket *socket = new QLocalSocket; 
QIODevice *server = new QIODevice; 

server = socket; 

... 그래서 컴파일러는 t에 문제가있는 사람이 왜 말해 줄 수 그의? 생성자가 QLocalServer *를 수락 할 수있는 방법이 있습니까? 생성자가 무효 포인터와 추가 변수를 가져 와서 무엇이 전송되는지 알려주는 핵 옵션이 있다고 가정하면 QLocalSocket 또는 QTcpSocket에 대한 void 포인터를 다시 작성할 수 있지만 reinterpret_cast를 사용하는 것이 불편합니다. C++ 다형성의 직접적인 비트가되어야하는 것처럼 보입니다.

감사합니다,

스티븐.

답변

1

가장 큰 이유는 오류가 발생한 소스 파일에서 #include <QLocalSocket>을 잊어 버린 것입니다.

+0

맙소사 저, 그래, 고쳐줍니다. 고맙습니다. 나는 그것이 qlocalserver.h에서 참조되었다고 추측했지만 분명히 그렇지 않다고 생각한다. –