gcc中class(*)()的含义

时间:2012-07-29 07:34:29

标签: c++ templates gcc most-vexing-parse

我无法理解这个编译器错误。我在帖子标题中写了类(*)(),因为我实例化的类叫做“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

3 个答案:

答案 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)

你点击most vexing parse

  

如果我宣布一个不透明的*并传递它来代替:

opaque rcv();

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

对于错误消息,opaque (*)()是指向返回opaque的函数的指针的类型。 &#34;功能的名称&#34;当用于除了调用之外的东西时,它被隐式转换为指针。