2012-01-17 77 views
0

这里是我的代码构造对象和调用成员函数

#include <iostream> 

using namespace std; 

class MyTestClass 
{ 
    int MyTestIVar; 

    public: 
     MyTestClass(void); 
     int firstCallMethod(void); 
     int secondCallMethod(void); 
}; 

MyTestClass::MyTestClass(void) 
{ 
    MyTestIVar = 4; 
} 
int MyTestClass::firstCallMethod(void) 
{ 
    return secondCallMethod(); 
} 
int MyTestClass::secondCallMethod(void) 
{ 
    return MyTestIVar; 
} 

int main(int argc, char *argv[]) 
{ 
    MyTestClass mTC; 
    cout << mTC.firstCallMethod() << endl; 
    return 0; 
} 

如果使用使用

MyTestClass mTC(); 

而是将不允许我打电话给任何成员函数,并显示此错误

./experiment.cpp: In function ‘int main(int, char**)’: ./experiment.cpp:31:14: error: request for member ‘firstCallMethod’ in ‘mTC’, which is of non-class type ‘MyTestClass()’

我读了关于value-initialize等的帖子,但是这个错误对我来说依然不合逻辑。为什么会影响会员功能?

和帮助非常感谢:-)

+0

你确定这个代码示例是否足以重现错误?你是否也意味着如果你将行“MyTestClass mTC;”与“MyTestClass mTC();”只有那么错误发生? – 2012-01-17 10:06:02

回答

5
MyTestClass mTC();  

没有声明MyTestClass类的对象,因为你的想法。

它实际上,通过名称mTC声明一个函数,它不接受任何参数并返回一个MyTestClass对象。

这就是所谓的Most Vexing Parse在C++中。

+0

奇怪,是不是解析器错误的错误,虽然因为在C++中,你不能在函数内声明函数?或者只是你不能在一个函数中定义一个函数? – rubixibuc 2012-01-17 10:09:12

+0

@rubixibuc:这是C++奇怪的黑暗角落之一,当你被它咬住时,你才会知道它,并且相信我大部分知道它被它咬过的人:) – 2012-01-17 10:13:28

3

你偶然发现了most vexing parse

线

MyTestClass mTC(); 

被解析为一个名为mTC函数不具有任何参数和返回的MyTestClass一个实例的一个功能的原型。