C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/877107/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++ error - "member initializer expression list treated as compound expression"
提问by Gilad Naor
I'm getting a C++ compiler error which I'm not familiar with. Probably a really stupid mistake, but I can't quite put my finger on it.
我收到一个我不熟悉的 C++ 编译器错误。可能是一个非常愚蠢的错误,但我无法完全理解它。
Error:
错误:
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'
Code:
代码:
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 }
Note: It looks like the compiler is evaluating the commas in line 27 like here: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/co.htm
注意:看起来编译器正在评估第 27 行中的逗号,如下所示:http: //publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/语言/参考/co.htm
edit:Okay, I understand the problem as Alan explained it. Now, for extra imaginary points, can someone explain how the compiler (g++) came up with the error message it gave?
编辑:好的,我理解艾伦解释的问题。现在,对于额外的虚点,有人可以解释编译器 (g++) 是如何得出它给出的错误消息的吗?
回答by Glen
m_bar is a reference, so you can't construct one.
m_bar 是一个参考,所以你不能构造一个。
As others have noted, you can initialise references with the object it refers to, but you can't construct one like you're trying to do.
正如其他人所指出的,您可以使用它所引用的对象来初始化引用,但您不能像尝试那样构造一个。
Change line 30 to
将第 30 行更改为
const Bar m_bar
and it'll compile / run properly.
它会编译/运行正常。
回答by Alan
m_bar is declared as a "const reference" and therefore can't be instantiated with the constructor you've supplied.
m_bar 被声明为“const 引用”,因此无法使用您提供的构造函数进行实例化。
Consider making m_bar a member, or passing a pre-constructed Bar object to the constructor.
考虑使 m_bar 成为成员,或将预先构造的 Bar 对象传递给构造函数。
回答by Alan
You can see the problem much more clearly in the following code:
您可以在以下代码中更清楚地看到问题:
struct B {
B( int a, int x ) {}
};
int main() {
const B & b( 1, 2);
}
which produces the following errors with g++:
使用 g++ 会产生以下错误:
t.cpp: In function 'int main()':
t.cpp:6: error: initializer expression list treated as compound expression
t.cpp:6: error: invalid initialization of reference of type 'const B&' from expression of type int'
VC++ 6.0 gives the even more gnomic error:
VC++ 6.0 给出了更多的侏儒错误:
error C2059: syntax error : 'constant'
Simply put, you can't initialise references like that.
简而言之,您不能像那样初始化引用。
回答by Tod
Although this question is old, for future readers I will point out that the item marked as answer is not correct.A reference can indeed be constructed.
虽然这个问题很老,但对于未来的读者,我会指出标记为答案的项目是不正确的。确实可以构造一个参考。
In an initializer line the code m_bar(foo, a)
is trying to use (foo,a)
as a constructor for m_bar. The error tells you that foo
will be ignored and you can't construct a Bar out of int a
. The following correct syntax will compile error free:
在初始化程序行中,代码m_bar(foo, a)
试图(foo,a)
用作 m_bar 的构造函数。该错误告诉您这foo
将被忽略,并且您无法从 int a
. 以下正确的语法将编译无错误:
m_bar (*new Bar(foo,a))