为什么对象变量声明后的括号会导致错误(C ++)?

时间:2016-02-05 01:07:09

标签: c++ most-vexing-parse

我在这个例子中创建了一个基本上充当公共结构的类,假设类名是X。我想在main函数中声明一个本地对象。我的问题的简短版本是:我知道我们可以做X foo;,但我认为X foo();(附加一对括号)应该可行,我认为第一次使用实际上是第二次使用的简写用法。整个代码如下:

#include <iostream>

using namespace std;

class X {
    public:
        int val1;
        int val2;
};

int main() {
    X a;
    X b();    // A warning here
    X *c = new X;
    X *d = new X();

    cout << "val of a: " << a.val1 << " " << a.val2 << endl;
    cout << "val of b: " << b.val1 << " " << b.val2 << endl;    // Compile error
    cout << "val of c: " << c->val1 << " " << c->val2 << endl;
    cout << "val of d: " << d->val1 << " " << d->val2 << endl;

    return 0;
}

编译器抱怨:

11_stack.cpp:16:6: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
        X ab();
            ^~
11_stack.cpp:16:6: note: replace parentheses with an initializer to declare a variable
        X ab();
            ^~
            {}
11_stack.cpp:22:26: error: use of undeclared identifier 'b'
        cout << "val of b: " << b.val1 << " " << b.val2 << endl;
                                ^
11_stack.cpp:22:43: error: use of undeclared identifier 'b'
        cout << "val of b: " << b.val1 << " " << b.val2 << endl;
                                                 ^
1 warning and 2 errors generated.

我最初的猜测如下:

  1. 在任何情况下,我们都不应在声明的变量之后放置一个空括号。
  2. 触发operator()
  3. 但后来我反驳了这两个假设。我们可以看到代码中的第一个反对:X *c = new X;X *d = new X();都有效。对于第二个,我添加了这样的附加代码:

    a();
    

    然后我收到了编译错误消息:

    11_stack.cpp:26:2: error: type 'X' does not provide a call operator
            a();
            ^
    

    究竟是什么导致错误?

    工作环境:

    • Mac OS 10.11.3
    • g ++ with flag c ++ 11
    • Xcode版本7.2(7C68)

    P.S。如果它太模糊,还请帮我思考一个更好的描述性帖子标题......

1 个答案:

答案 0 :(得分:0)

cd是指针,因此您需要c->val1而不是.