"Function"不是C++型
"Function" is not a type C++
我想创建一个模板类并传递给它一个比较函数。我在这个链接上找到了一个很好的答案
不幸的是,当我制作一个名为"WaitingQueue"的模板类并在类的构造函数(在类 foo 中)中传递比较函数时,代码无法编译并抛出错误:"'比较'不是一种类型"。
我无法理解这里的错误。上面链接中的代码运行没有错误。谁能告诉我我在这里做错了什么?提前致谢
#include <stdint.h>
#include <stddef.h>
#include <string.h>
enum { OK, ERROR };
template <class T>
class WaitingQueue
{
struct QueueElement
{
public:
T data;
QueueElement *next;
QueueElement(T *pdata): next(0)
{
memcpy(&data, pdata, sizeof(T));
}
};
QueueElement *head, tail;
public:
bool (*comparefunc)(uint16_t, T*);
WaitingQueue (bool (*compareFunction)(uint16_t, T*)) :comparefunc(compareFunction), head(0), tail(0) { }
int search(int16_t id, T *ret_data)
{
QueueElement *temp = head;
QueueElement *prev = 0;
if (temp != NULL)
{
if (comparefunc(id, &temp->data) == true)
{
if (prev)
{
prev->next = temp->next;
}
else
{
head = head->next;
}
memcpy(ret_data, &temp->data, sizeof(temp->data));
delete temp;
return OK;
}
prev = temp;
temp = temp->next;
}
return ERROR;
}
};
typedef struct _cmd
{
uint8_t flags;
uint16_t id;
} cmd;
bool compare(uint16_t id, cmd *cmd)
{
return (cmd->id == id);
}
class foo
{
WaitingQueue<cmd> queue(compare);
};
这是通常令人烦恼的解析。 编译器将WorkingQueue<cmd> queue(compare);
理解为名为queue
的方法的声明,该方法返回WorkingQueue<cmd>
并获取不存在类型的对象compare
。你可以让它明白你的意思是通过使用大括号初始化来声明一个用 compare
函数初始化的字段:
WaitingQueue<cmd> queue{compare};
相关文章:
- 检查输入是否不是整数或数字
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么使用SFINAE而不是函数重载
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 为什么std::valarray不是算术的
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 为什么make_tie不是一件事
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 为什么std::isnan 不是 constexpr?
- GlobalAlloc而不是其他分配方法
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么复制而不是移动数据元素?
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和