Il passaggio di un QLocalSocket * a un metodo che prevede un QIODevice *
-
30-09-2019 - |
Domanda
Forse devo essere troppo ambizioso, ma sto cercando di scrivere un programma server che può accettare connessioni su entrambi i QLocalSockets e QTcpSockets. Il concetto è quello di avere un oggetto 'nesso' sia con un ascolto QLocalServer e QTcpServer per nuove connessioni:
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);
}
... e poi gli slot separati che stabiliscono un oggetto server, il cui costruttore prende un puntatore ad un QIODevice. In teoria, questo dovrebbe per lavoro, perché sia ??QLocalSocket e QTcpSocket ereditano QIODevice. Ecco lo slot newLocalConnection, ad esempio:
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();
}
Il problema è che questo non si compila, dando un errore:
Errore C2664: 'CalculationServer :: CalculationServer (QIODevice *, QObject *)': non può convertire il parametro 1 da 'QLocalSocket *' per 'QIODevice *' 1> Tipi di punte per non sono correlati; conversione richiede reinterpret_cast, cast di tipo C o cast di tipo funzione
Ora i tipi hanno indicato sono chiaramente non non collegati, e altrove nel mio codice non ho problemi a tutti con azioni come:
QLocalSocket *socket = new QLocalSocket;
QIODevice *server = new QIODevice;
server = socket;
... così qualcuno può dirmi il motivo per cui il compilatore ha un problema con questo? C'è un modo che io possa fare il costruttore accetta l'QLocalServer *? Suppongo che ci sia l'opzione nucleare di ottenere il costruttore di prendere un puntatore nullo, più una variabile in più per dire che quello che è stato inviato, in modo che possa poi riformulare il puntatore nullo, o un QLocalSocket o QTcpSocket, ma mi sento ricorrendo a disagio a reinterpret_cast su quello che sembra che dovrebbe essere un po 'semplice di C ++ polimorfismo.
Saluti,
Stefano.
Soluzione
La ragione più probabile è che si è dimenticato di #include <QLocalSocket>
nel file di origine in cui si verifica l'errore.