错误:请求“..”中的成员“..”,它是非类的types

我有一个类有两个构造函数,一个没有参数,一个只有一个参数。

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

例如,如果我编译这个代码(使用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 ()()' 

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

 Foo foo2(); 

改成

 Foo foo2; 

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

 Foo foo2() 

作为名称为“foo2”和返回types“Foo”的函数声明。

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

只是为了logging..

它实际上不是你的代码的解决scheme,但是当我错误地访问由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) 

我希望这能帮助那些按照我的方式来解决这个问题的人。

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

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

基本上是试图传递一个临时的Bar对象给Foo的构造函数。 原来编译器正在翻译这个

 Foo foo(Bar(*)()); 

也就是一个函数声明,其名称是foo,返回一个Foo,该函数接受一个参数 – 一个函数指针,返回带有0个参数的Bar。 在传递像这样的临时数据时,最好使用Bar{}而不是Bar()来消除歧义。

添加我的错误,我试过了:

Foo.low[i]

代替:

Foo[i].low