Question

Peut-être que je suis être trop ambitieux, mais je suis en train d'écrire un programme serveur qui peut accepter des connexions sur les deux QLocalSockets et QTcpSockets. Le concept est d'avoir un objet « nexus » à la fois une écoute QLocalServer et QTcpServer pour les nouvelles connexions:

    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);
    }

... puis fentes séparées qui définissent un objet de serveur, dont le constructeur prend un pointeur vers une QIODevice. En théorie, cela devrait au travail parce que les deux QLocalSocket et QTcpSocket hériteront QIODevice. Voici la fente newLocalConnection, par exemple:

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();
}

Le problème est que cela ne compile pas, ce qui donne une erreur:

  erreur

C2664:   « CalculationServer :: CalculationServer (QIODevice   *, QObject *) »: ne peut pas convertir le paramètre 1 de 'QLocalSocket *' pour   'QIODevice *' 1> Types pointue   à ne sont pas liés; conversion nécessite   reinterpret_cast, fonte de style C ou   fonte fonction de style

Maintenant, les types sont clairement souligné pas sans rapport, et ailleurs dans mon code que j'ai aucun problème avec des actions telles que:

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

server = socket;

... si quelqu'un peut me dire pourquoi le compilateur a un problème avec cela? Est-il possible que je puisse faire le constructeur accepte la QLocalServer *? Je suppose qu'il ya l'option nucléaire d'obtenir le constructeur de prendre un pointeur vide plus une variable supplémentaire pour lui dire ce qu'il est échangé, il peut alors refondre le pointeur vide soit un QLocalSocket ou QTcpSocket, mais je me sens le recours mal à l'aise reinterpret_cast sur ce qui ressemble à ce devrait être un peu simple du polymorphisme de C.

Cordialement,

Stephen.

Était-ce utile?

La solution

La raison la plus probable est que vous avez oublié de #include <QLocalSocket> dans le fichier source où l'erreur se produit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top