11

私はいくつかの HID デバイスを使用していますが、そのすべてに次の基本クラス ( main.h 内)から派生したクラスがあります。

class HIDDevice {
    public:
        hid_device *device;

        virtual void read(std::fstream)=0;
        virtual void write(std::fstream)=0;
};

そこから派生したデバイス クラスの 1 つを次に示します ( device.h )。

class MyDevice : public HIDDevice {
    public:
        void read(std::fstream);
        void write(std::fstream);
};

...そして実装のサンプル:

void MyDevice::read(std::fstream file) {
    // Read from card and write to file
    response = send_command(READ_DEVICE);
    file.write((char *)&response[0], response.size());
}

...そして発信者:

fstream file (filename, ios::binary | ios::in);
dev->read(file);

コンパイルしようとすると、次のエラーが発生します。

main.cpp:294:27: エラー: 削除された関数の使用 'std::basic_fstream::basic_fstream(const std::basic_fstream&)'<br> source/main.cpp:24:0 からインクルードされたファイル: /usr/ include/c++/4.6/fstream:761:11: エラー: 'std::basic_fstream::basic_fstream(const std::basic_fstream&)' は暗黙的に削除されます。これは、デフォルトの定義の形式が正しくないためです:

...そして、おそらく私がC ++にかなり慣れていないため、理由がわかりません。ばかげたことをしました。

引数を (& を使用して) 参照に戻すと、次のエラーが発生します。

/main.o:(.rodata._ZTV13MyDevice[MyDevice の vtable]+0x18): 「MyDevice::write(std::basic_fstream >&)」への未定義の参照

誰でもこの問題を解決するのを手伝ってもらえますか?

4

4 に答える 4

21

それらを参照して投げてみてくださいstd::fstream

class MyDevice : public HIDDevice {
    public:
        void read(std::fstream&);
        void write(std::fstream&);
};
于 2012-09-14T22:50:48.553 に答える
5

参考までに、同じコンパイラ エラーが発生しましたが、別の方法で作成したため、すぐにはわかりませんでした。習慣から私は書いた:

auto stream = fstream(output, iOS::out | iOS::binary);

もちろん、これは一時的な fstream オブジェクトを作成し、それをストリームにコピーします。これは、clang を使用して Xcode 6 で機能しましたが、GCC 4.9.2 では機能しませんでした。

于 2015-07-13T14:49:35.473 に答える
3

HIDDeviceメソッド シグネチャは、 が値渡しされていることを意味しますfstream。これは、コピー コンストラクターを使用して、元のストリーム オブジェクトのコピーを呼び出しサイトで作成する必要があることを意味します。正規の署名を持つのは、このコピー コンストラクターですstd::basic_fstream::basic_fstream(const std::basic_fstream&)

コンパイラは、何らかの理由で (basic_fstream標準ライブラリが使用する実装の詳細に関係する)、このコピー コンストラクターを自動生成できないため、ストリームのコピーを作成する暗黙のコマンドを実行できないことを通知しています。

他の人がすでに言ったように、通常の手口 (ここでもエラーを防ぎます) は、値ではなく参照によって引数を渡すことです。

于 2012-09-14T22:55:09.413 に答える
1

&std::fstreamパラメータとして参照によって渡され、どこでも同じオブジェクトとして使用されます。これにより、実装が別のインスタンスを作成しようとし、関数の終了時にストリームを閉じることが回避されます (コピーされたオブジェクトが破棄されるため)。

メンバー関数の宣言と実装の両方 (つまり、クラスと本体の場所) でこれを変更してください。

于 2012-09-14T22:51:18.783 に答える