2

我无法理解这个编译器错误。我在帖子标题中写了 class(*)() 因为我正在实例化的类称为“不透明”,但该名称不提供信息或相关。它是一个模板化的循环缓冲区和一些测试。我正在使用 opaque 类来测试具有完整类/结构类型的数据结构。我也在使用原语(目前是 int)进行测试,并且该测试函数不会给我这个编译器错误。还有比这更多的代码,但我提供了我认为相关的部分。如果您有兴趣,完整的代码在这里。

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 (*)())’

测试.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* 并将其传递给删除:

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
4

3 回答 3

1

如果您有声明foo x();,则表达式&x实际上是一个函数指针,可分配给类似foo *(y)(). 您上一个示例中的p变量不是这样的函数指针,而只是指向结构的指针opaque。因此,您不能将函数指针分配给该变量。

[编辑] 刚刚记住:也许您打算声明一个opaque变量并使用默认构造函数对其进行初始化。然后省略括号。这是 C 语言中遗留下来的语法。如果您实际上将值放在两者之间以调用不同的构造函数,则只能在其中使用括号。

于 2012-07-29T07:42:54.627 回答
1

你在做什么:

opaque rcv();

是您正在“声明一个函数”,其名称rcv具有返回类型opaque,并且不带任何参数。检查此链接

去掉括号:

opaque rcv;
于 2012-07-29T07:48:14.767 回答
0

你遇到了最令人头疼的 parse

如果我声明一个 opaque* 并将其传递给删除:

opaque rcv();

这声明了一个返回的函数opaque,而不是默认初始化的opaque。而是使用opaque rcv;or opaque rcv = {};

至于错误信息,opaque (*)()是指向返回函数的指针的类型opaque。“函数”的名称在用于调用以外的其他内容时被隐式转换为指针。

于 2012-07-29T07:56:07.530 回答