错误:请求“..”中的成员“..”,它是非类的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