データ シンクへのインターフェイスを定義する抽象基本クラスがあります。データ シンクの具体的な実装は、ファクトリを介して取得されます。コードを整理するために、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 です。どんな洞察も大歓迎です。