Я создал класс, который в основном служит публичной структурой в этом примере, и, скажем, имя класса X
. Я хочу объявить локальный объект в главной функции. Короткий вариант моего вопроса: я знаю, что мы можем сделать X foo;
, но я думаю, что X foo();
(прикрепите пару круглых скобок) должен работать, и я думал, что первое использование на самом деле является сокращением второго использования. Весь код приведен ниже:Почему скобка после объявления переменной объекта вызывает ошибку (C++)?
#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.
Мои первоначальные предположения являются следующие:
- В любом случае, мы не должны ставить пустой скобки после объявленной переменной.
- Он вызывает
operator()
.
Но позже я опроверг обе гипотезы. Мы можем видеть первое недостоверствование в коде: и 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
- г ++ с флагом C++ 11
- Xcode версии 7.2 (7C68)
P.S. Пожалуйста, помогите мне кажется, лучше и описательный заголовок поста, если он слишком неоднозначны ...
Фактически чтение предупреждения помогло бы. –
Релевантно: http://stackoverflow.com/questions/17713124/what-does-aa-mean/17713134?s=14|0.6182#17713134 –
См. [Most Vexing Parse] (https://en.wikipedia.org/ вики/Most_vexing_parse); поэтому C++ 11 представил [единообразный синтаксис инициализации] (https://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization). – ShadowRanger