Передача QLocalsocket * для метода, ожидающего Quiodevice *
-
30-09-2019 - |
Вопрос
Возможно, я чрезмерно амбициозным, но я пытаюсь написать серверную программу, которая может принимать соединения по двум qlocassockets, так и Qtcplockets. Концепция состоит в том, чтобы иметь объект «Nexus» с помощью QLOCAserver, так и QTCPServer, слушающий новые соединения:
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);
}
... а затем отдельные слоты, которые устанавливают серверный объект, конструктор которого принимает указатель на QioDevice. Теоретически, это должен работать потому, что и 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();
}
Проблема в том, что это не скомпированно, давая ошибку:
Ошибка C2664: «Расчет :: Скалыватель (QioDevice *, Qobject *)»: не может преобразовать параметр 1 из «QLOCAlsocket *» на «QioDevice *» 1>, на которые указывают на не связанные; Преобразование требует ReinterPret_cast, Chast C-стиль или элементы функционального стиля
Теперь типы указывают на ясно нет не связанные, и в другом месте в моем коде у меня нет проблем вообще с действиями, такими как:
QLocalSocket *socket = new QLocalSocket;
QIODevice *server = new QIODevice;
server = socket;
... так что кто-нибудь может сказать мне, почему компилятор имеет проблему с этим? Есть ли способ, которым я могу сделать конструктор принять QLOCAserver *? Я полагаю, что есть ядерный вариант получения конструктора, чтобы сделать указатель пустоты, а также дополнительную переменную, чтобы сказать ему, что она отправляется, поэтому он может затем передать указатель пустоты на QLocalsocket или qtcplocket, но я чувствую себя неудобно, прибегаю к ReinterPret_cast На что похоже, что он должен быть простой полиморфизмом C ++.
С уважением,
Стивен.
Решение
Наиболее вероятная причина в том, что вы забыли #include <QLocalSocket>
В исходном файле, где возникает ошибка.