C ++错误 - “成员初始化表达式列表被视为复合表达式”

时间:2009-05-18 10:41:10

标签: c++

我遇到了一个我不熟悉的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 ++)如何提供它给出的错误消息吗?

4 个答案:

答案 0 :(得分:16)

m_bar是一个引用,因此您无法构造一个。

正如其他人所指出的那样,你可以用引用的对象初始化引用,但你不能像你想要的那样构造引用。

将第30行更改为

const Bar m_bar

它将正确编译/运行。

答案 1 :(得分:4)

m_bar被声明为“const引用”,因此无法使用您提供的构造函数进行实例化。

考虑将m_bar作为成员,或者将预先构造的Bar对象传递给构造函数。

答案 2 :(得分:3)

您可以在以下代码中更清楚地看到问题:

struct B {
    B( int a, int x  ) {}
};

int main() {
    const B & b( 1, 2);
}

使用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提供了更多的基本错误:

 error C2059: syntax error : 'constant'

简单地说,你不能初始化那样的引用。

答案 3 :(得分:-1)

虽然这个问题很老,但对于未来的读者,我会指出标记为答案的项目不正确。确实可以构建引用。

在初始化行中,代码m_bar(foo, a)正在尝试使用(foo,a)作为m_bar的构造函数。该错误告诉您foo将被忽略,您无法从int a构建一个Bar。以下正确的语法将无错编译:

m_bar (*new Bar(foo,a))