我有一个有两个构造函数的类,一个不接受参数,一个接受一个参数。

使用带一个参数的构造函数创建对象可以正常工作。但是,如果我使用不带参数的构造函数创建对象,就会得到一个错误。

例如,如果我编译这段代码(使用g++ 4.0.1)…

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2();
  foo2.bar();

  return 0;
}

... 我得到以下错误:

nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’

为什么会这样,我该怎么做呢?


当前回答

添加到知识库中,我得到了相同的错误

if(class_iter->num == *int_iter)

尽管IDE给了我class_iter的正确成员。显然,问题是"anything"::iterator没有一个名为num的成员,所以我需要对它解引用。它不是这样工作的:

if(*class_iter->num == *int_iter)

…很明显。我最终用这个解决了这个问题:

if((*class_iter)->num == *int_iter)

我希望这能帮助到像我一样遇到这个问题的人。

其他回答

如果你想声明一个没有参数的新实体(知道对象有默认参数),不要写

 type substance1();

but

 type substance;

当不打算使用参数化构造函数时,实例化类对象不需要括号。

只需使用Foo foo2;

它会起作用的。

我遇到了这样的情况,我得到了错误信息

Foo foo(Bar());

基本上是试图将一个临时的Bar对象传递给Foo构造函数。结果是编译器把这个翻译成

Foo foo(Bar(*)());

也就是说,一个名为foo的函数声明,它返回一个带参数的foo——一个函数指针,返回一个带0个参数的Bar。当像这样传递临时对象时,最好使用Bar{}而不是Bar()来消除歧义。

我有一个类似的错误,似乎编译器误解了没有参数的构造函数的调用。我通过从变量声明中删除圆括号来使它工作,在你的代码中是这样的:

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2; // Without "()" 
  foo2.bar();

  return 0;
}
Foo foo2();

改变

Foo foo2;

你得到错误,因为编译器认为

Foo foo2()

如函数声明名称为'foo2',返回类型为'Foo'。

但在这种情况下,如果我们更改为Foo foo2,编译器可能会显示错误“重载' Foo() '的调用是模糊的”。