1

operator <<Qtでオーバーロードしようとしています。

class MyCryptographicHash : public QCryptographicHash
{
public:
    MyCryptographicHash(Algorithm method);

    void addData(const QString &data );

    friend MyCryptographicHash& operator<< (MyCryptographicHash &obj, const QString &value);

private:
    QByteArray _data;
};

MyCryptographicHash& operator<<(MyCryptographicHash &obj, const QString &value) {
    obj.addData(value);
    return obj;
}


    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    MyCryptographicHash *hash1 = new MyCryptographicHash(QCryptographicHash::Sha1);
    MyCryptographicHash *hash2 = new MyCryptographicHash(QCryptographicHash::Sha1);
    hash1->addData("abc1234");
    QString a;
    a = "qweer321";
    hash2<<a;
    qDebug() << "HASH1: " << hash1->result();
    qDebug() << "HASH2: " << hash2->result();
}

しかし、私はエラーが発生します:

no match for 'operator<<' in 'hash2 << a'

演算子をクラスのメンバーとして宣言しようとしましたが、エラーも発生します。

error: 'MyCryptographicHash& MyCryptographicHash::operator<<(MyCryptographicHash&, const QString&)' must take exactly one argument

私は何を間違っていますか?

4

1 に答える 1

5

あなたのコードは

*hash2 << a;

hash2 はポインタであり、オブジェクトではありません。

ただし、投稿したコードには、hash2 がポインターである明確な理由はありません。だからあなたはただ書くことができます

{
    MyCryptographicHash hash1(QCryptographicHash::Sha1);
    MyCryptographicHash hash2(QCryptographicHash::Sha1);
    hash1.addData("abc1234");
    QString a;
    a = "qweer321";
    hash2 << a;
    qDebug() << "HASH1: " << hash1.result();
    qDebug() << "HASH2: " << hash2.result();
}

これには、メモリリークがないという利点もあります。

しかし、あなたが投稿したコード以上のものがあるかもしれません。

于 2013-04-20T07:27:39.540 に答える