gpt4 book ai didi

c++ - 使用 typedef 函数指针的不完整类型

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:58 25 4
gpt4 key购买 nike

我有一个定义数据接收器接口(interface)的抽象基类。数据接收器的具体实现是通过工厂获取的。为了整理代码,我为工厂方法创建了一个 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。非常感谢任何见解。

最佳答案

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* 与之前的函数类型指针相同。

关于c++ - 使用 typedef 函数指针的不完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6274510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com