我无法理解这个编译器错误。我在帖子标题中写了类(*)(),因为我实例化的类叫做“opaque”,但是这个名字不具备信息性或相关性。它是一个模板化的循环缓冲区和一些测试。我使用opaque类来测试具有完整类/结构类型的数据结构。我也在测试原语(目前是int),测试函数不会给我这个编译器错误。代码多于此,但我提供了我认为相关的部分。 如果您有兴趣,完整代码为here。
gcc错误:
tests.cpp: In function ‘bool opaque_fill_test(int)’:
tests.cpp:97:23: error: no matching function for call to ‘CircBuf<opaque>::remove(opaque (*)())’
tests.cpp:
struct opaque {
int id;
opaque(int n): id(n) {}
opaque operator=(const opaque &o) { this->id = o.id; }
};
opaque rcv();
CircBuf<opaque> c(size);
for (int i=0; i<size; i++) {
if ( c.remove(&rcv)) {
if (rcv.id != i ) {
cout << "wrong value: " << rcv << " "
<< "should be: " << i << endl;
return false;
}
} else {
cout << "remove fail at i=" << rcv << endl;
return false;
}
}
CircBuf.h:
template<typename T> class CircBuf {
...
template<typename T> bool CircBuf<T>::remove(T *t) {
...
*t = data[front];
...
如果我宣布一个不透明的*并传递它来代替:
opaque rcv();
opaque* p = &rcv;
for (int i=0; i<size; i++) {
if ( c.remove(p)) {
...
...
我得到了类似的错误:
tests.cpp: In function ‘bool opaque_fill_test(int)’:
tests.cpp:96:16: error: cannot convert ‘opaque (*)()’ to ‘opaque*’ in initialization
答案 0 :(得分:1)
如果您有声明foo x();
,则表达式&x
实际上是一个可分配给foo *(y)()
之类的函数指针。上一个示例中的p
变量不是这样的函数指针,而只是指向opaque
结构的指针。因此,您无法将函数指针指定给该变量。
[编辑]
记住:也许您打算声明一个opaque
变量并使用默认构造函数初始化它。然后省略括号。它是来自C的遗留语法。如果你实际上在其间放置值来调用不同的构造函数,那么你只能在那里使用括号。
答案 1 :(得分:1)
你在做什么:
opaque rcv();
是您“声明一个函数”,其名称rcv
具有返回类型opaque
,并且不带参数。 Check this link
删除paranthesis:
opaque rcv;
答案 2 :(得分:0)
如果我宣布一个不透明的*并传递它来代替:
opaque rcv();
声明一个函数返回opaque
,而不是默认初始化的opaque
。而是使用opaque rcv;
或opaque rcv = {};
。
对于错误消息,opaque (*)()
是指向返回opaque
的函数的指针的类型。 &#34;功能的名称&#34;当用于除了调用之外的东西时,它被隐式转换为指针。