2

データ シンクへのインターフェイスを定義する抽象基本クラスがあります。データ シンクの具体的な実装は、ファクトリを介して取得されます。コードを整理するために、DataSink 抽象基本クラス内から新しい DataSink オブジェクトを返すファクトリ メソッドの typedef を作成しました。

#include <memory>
#include <string>

class DataSink
{
    public:
            DataSink() { }
            virtual ~DataSink() { }
            void Open(const std::string path)
            {
                    InternalOpen(path);
            }
            bool IsOpen()
            {
                    return InternalIsOpen();
            }
            void Write(const uint8_t* data, const size_t offset, const size_t size)
            {
                    InternalWrite(data, offset, size);
            }
            void Close()
            {
                    InternalClose();
            }

    protected:
            virtual void InternalOpen(const std::string path) = 0;
            virtual bool InternalIsOpen() = 0;
            virtual void InternalWrite(const uint8_t* data, const size_t offset, const size_t size) = 0;
            virtual void InternalClose() = 0;
};
typedef std::auto_ptr<DataSink>(*get_new_data_sink_function_type)(std::string);


boost::function<get_new_data_sink_function_type> getNewDataSinkFunction_;
その後、どこかで a: を宣言しようとすると、次のようになります。
error: field 'getNewDataSinkFunction_' has incomplete type
代わりに宣言すると:
boost::function<std::auto_ptr<DataSink>(std::string)> getNewDataSinkFunction_;
...すべて問題ありません。

DataSink は抽象的であるため不完全な型であることに気付きましたが、std::auto_ptr による参照セマンティクスを使用しているため、それで問題ないはずですよね? いずれにせよ、typedef が失敗し、typedef の定義のカット アンド ペーストが成功する理由は説明できません。これは boost::function の癖ですか?

コンパイラは gcc 4.3.3 です。どんな洞察も大歓迎です。

4

1 に答える 1

3

get_new_data_sink_function_type関数型ではなく、関数へのポインタ型です。boost::function関数型 (または署名) が必要です。

さらに、抽象クラスは不完全な型である必要はありません (そして、それはあなたのサイトにありませんtypedef)。boost::function警告の「不完全な型」の部分は、次のように記述されている可能性があるという事実に由来する可能性があります。

template<typename Sig>
class function; // Not defined!

template<typename Ret, typename Arg>
class function<Ret(Arg)> {
    // ...
};

// Various other specializations

つまりboost::function、あなたの場合のように、非関数型でインスタンス化された場合、特殊化は一致せず、基本テンプレートが選択されます。定義されていないため、不完全型です。


あなたができる最も簡単な修正はtypedef、実際の関数型にすることです。これにより、その名前が誤解を招くことはなくなります。

typedef std::auto_ptr<DataSink> get_new_data_sink_function_type(std::string);

get_new_data_sink_function_type*これにより、以前と同じ関数型へのポインターであることに注意してください。

于 2011-06-08T05:22:44.990 に答える