qlocalsocket*をqiodevice*を期待するメソッドに渡す*
-
30-09-2019 - |
質問
おそらく私は野心的であるかもしれませんが、QlocalsocketsとQTCPSOCKETSの両方に接続を受け入れることができるサーバープログラムを作成しようとしています。コンセプトは、qlocalserverとqtcpserverの両方を備えた「nexus」オブジェクトを持っていることです。
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: 'calculationerver :: calculationerver(qiodevice *、qobject *)':パラメーター1を「qlocalsocket *」から「qiodevice *」に変換できません。コンバージョンには、reintrepret_cast、Cスタイルのキャスト、または機能スタイルのキャストが必要です
今、指摘されたタイプは明らかにです いいえ 無関係で、私のコードの他の場所では、次のようなアクションにまったく問題ありません。
QLocalSocket *socket = new QLocalSocket;
QIODevice *server = new QIODevice;
server = socket;
...だから、なぜコンパイラーがこれに問題を抱えているのかを教えてもらえますか?コンストラクターにqlocalserver*を受け入れるようにする方法はありますか?コンストラクターにボイドポインターに加えて送信されているものを伝えるために追加の変数を取得するという核オプションがあると思います。そのため、ボイドポインターをqlocalsocketまたはqtcpsocketのいずれかに再構築できますが、reintrepret_castに頼る不快感を感じます見た目は、C ++多型の簡単なビットであるはずです。
よろしく、
スティーブン。
解決
最も可能性の高い理由は、あなたが忘れてしまったことです #include <QLocalSocket>
エラーが発生するソースファイルで。