Вопрос

Возможно, я чрезмерно амбициозным, но я пытаюсь написать серверную программу, которая может принимать соединения по двум 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> В исходном файле, где возникает ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top