【发布时间】:2009-05-18 10:41:09
【问题描述】:
我遇到了一个我不熟悉的 C++ 编译器错误。可能是一个非常愚蠢的错误,但我不能完全指出它。
错误:
test.cpp:27: error: member initializer expression list treated as compound expression
test.cpp:27: warning: left-hand operand of comma has no effect
test.cpp:27: error: invalid initialization of reference of type ‘const Bar&’ from expression of type ‘int’
代码:
1 #include <iostream>
2
3 class Foo {
4 public:
5 Foo(float f) :
6 m_f(f)
7 {}
8
9 float m_f;
10 };
11
12 class Bar {
13 public:
14 Bar(const Foo& foo, int i) :
15 m_foo(foo),
16 m_i(i)
17 {}
18
19 const Foo& m_foo;
20 int m_i;
21 };
22
23
24 class Baz {
25 public:
26 Baz(const Foo& foo, int a) :
27 m_bar(foo, a)
28 {}
29
30 const Bar& m_bar;
31 };
32
33 int main(int argc, char *argv[]) {
34 Foo a(3.14);
35 Baz b(a, 5.0);
36
37 std::cout << b.m_bar.m_i << " " << b.m_bar.m_foo.m_f << std::endl;
38
39 return 0;
40 }
注意: 看起来编译器正在评估第 27 行中的逗号,如下所示: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/co.htm
编辑: 好的,我理解艾伦解释的问题。现在,对于额外的想象点,有人可以解释编译器(g++)是如何得出它给出的错误消息的吗?
【问题讨论】:
-
g++ 是如何得出它的错误信息的?不知道。 Sun Studio 在第 27 行给出了这个错误:错误:m_bar 的初始化程序太多。它的信息量更大一些。简短的回答是,许多编译器错误消息往往有点难以阅读。
-
补充说明:之所以出现这个错误,是因为代码试图用
(foo,a)的构造函数构造一个Bar。错误消息告诉您 foo 将被忽略并且它无法将int a转换为 Bar。我知道这是一个古老的问题,但是您标记为答案的内容是不正确且具有误导性的。我发布了有关如何单独保留m_bar声明并对其进行编译的代码。
标签: c++