【发布时间】:2011-09-10 14:20:09
【问题描述】:
我有一个定义数据接收器接口的抽象基类。数据接收器的具体实现是通过工厂获得的。为了整理代码,我为工厂方法创建了一个 typedef,它从 DataSink 抽象基类中返回新的 DataSink 对象。
#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_;
在路上的某个地方,我得到: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。任何见解都非常感谢。
【问题讨论】:
-
const参数上的const限定符确实不需要,删除它们会使代码更适合问题(没有水平滚动条)。 -
你是对的,因为它们是按值传递的。
const我知道的限定论点是const几乎已经成为一种反射...有点过分热心,那里:)
标签: c++ typedef auto-ptr boost-function incomplete-type