我有一个 A 类,它接受 B 类作为构造函数参数。B 类可以从 int 值构造。我的原始代码非常复杂,但我希望我已将其简化为基本情况:
class B {
public:
explicit B(int a) : val(a) {}
private:
int val;
};
class A {
public:
A(const B & val) : value(val) {};
void print() {
//does nothing
}
private:
B value;
};
int main() {
int someTimeVar = 22;
A a(B(someTimeVar));
a.print();
}
这是我得到的错误代码:
$ g++ test.cpp -Wall -O0
test.cpp: In function ‘int main()’:
test.cpp:22:7: error: request for member ‘print’ in ‘a’, which is of non-class type ‘A(B)’
a.print();
^
test.cpp:20:9: warning: unused variable ‘someTimeVar’ [-Wunused-variable]
int someTimeVar = 22;
^
我使用 GCC (4.9.2 20150304 (prerelease)),平台:arch linux。
对 main 函数的以下修改编译良好:
int main() {
A a(B(22));
a.print();
}
我很清楚使用 A a(); 声明一个函数,而不是一个对象。但我没想到 A a(B(some_val)) 会做同样的事情,我认为这就是这里发生的事情。
你知道为什么会这样吗?
编辑:谢谢你的所有答案,看起来我需要更多地研究最令人烦恼的解析想法。
顺便说一句,事实证明,使用 clang 编译我的代码提供了更有用的错误消息和解决方案:
$ clang test.cpp
test.cpp:21:8: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
A a(B(someTimeVar));
^~~~~~~~~~~~~~~~
test.cpp:21:9: note: add a pair of parentheses to declare a variable
A a(B(someTimeVar));
^
( )
test.cpp:22:6: error: member reference base type 'A (B)' is not a structure or union
a.print();
~^~~~~~
1 warning and 1 error generated.