错误:请求会员'..'在'..'中是非班级类型

问题描述:

我有一个带有两个构造函数的类,一个不接受任何参数,一个接受一个参数。错误:请求会员'..'在'..'中是非班级类型

使用带有一个参数的构造函数创建对象将按预期方式工作。但是,如果我使用不带参数的构造函数创建对象,则会出现错误。

举例来说,如果我编译这段代码(使用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()()’ 

这是为什么,和我如何使它工作?

+0

相关:http://stackoverflow.com/q/2318650/69537 – Meysam 2012-08-06 06:24:35

Foo foo2(); 

变化

Foo foo2; 

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

Foo foo2() 

与名称 'foo2的' 和返回类型 '富' 函数声明。

但是在这种情况下,如果我们更改为Foo foo2,编译器可能会显示错误" call of overloaded ‘Foo()’ is ambiguous"

+0

我不明白为什么编译器认为:富foo2的()的函数声明,主要的功能里面。 – 2017-10-24 19:48:17

+0

显然我之前就登陆过这个答案,因为我再也无法提供它了!这是一个文本第二upvote ...和第二个谢谢! – bigjosh 2017-11-04 04:39:12

+0

无参数函数声明应该有强制的“void”参数,以便从一致性的角度允许这种用法。如果我没有弄错,K&R C强制使用术语无效。 – Rajesh 2018-01-22 05:08:56

只是为了记录..

它实际上不是你的代码的解决方案,但我有错误的时候访问类实例的指向myPointerToClass,例如方法相同的错误信息

MyClass* myPointerToClass = new MyClass(); 
myPointerToClass.aMethodOfThatClass(); 

其中

myPointerToClass->aMethodOfThatClass(); 

显然是正确的。

添加到的知识基础,我得到了同样的错误

if(class_iter->num == *int_iter) 

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

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

...显然。我最终解决了这个问题:

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

我希望这可以帮助那些以我的方式来解决这个问题的人。

我有一个类似的错误,似乎编译器误解了没有参数的构造函数的调用。我把它从变量的声明是这样去除括号,在你的代码的东西的工作:不需要

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 foo(Bar()); 

,并基本上是试图在一个临时酒吧对象到富构造函数传递的情况。原来,编译器翻译这

Foo foo(Bar(*)()); 

就是一个函数声明,其名是foo,它返回一个Foo,它接受一个参数 - 一个函数指针返回酒吧0参数。在通过像这样的临时工时,最好使用Bar{}而不是Bar()来消除歧义。

添加我的错误,我已经试过:

Foo.low[i]

相反的:

Foo[i].low

如果你想声明没有参数的新物质(明知对象有默认参数)不写

type substance1(); 

type substance;