BUG: Member Function Referenced Without () CompilesID: Q155046
|
Leaving the parentheses off a member function call, or leaving the ampersand ("&") off a reference to a pointer to a member function, does not result in a compiler error.
In both cases, the Visual C++ compiler is incorrectly treating the reference as a pointer to the member function. A pointer to a member function cannot be referenced via a specific instance of a class (for example, "obj.MyFunct" in the sample code below). Instead, it must be referenced via the class name, scope operator and '&' operator (for example, &CMyClass::MyFunc in the sample code below).
The compiler should report an error on the line in question.
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
/* Compile options needed:
*/
class CMyClass
{
public:
void MyFunc() {int nVar = 100; }
};
void main()
{
CMyClass obj;
obj.MyFunc(); //Correct syntax - calls the member function
obj.MyFunc; //Typo, no (), should result in error but doesn't
//VC 5.0: correct warning C4551
CMyClass::MyFunc; // Typo, no &, should result in error but doesn't
&CMyClass::MyFunc; // Correctly treated as a pointer to member
// function.
}
Note that executing the program generated by the above code causes no run-
time errors, but executes MyFunc only once. The incorrect line has no
affect because it is treated exactly the same as the line following it.
if (obj.MyFunc) { // Should be an error, instead always evaluates to
// TRUE. This code always executes.
}
else {
// This code will never be reached.
}
Additional query words: kbVC420bug kbVC400bug
Keywords : kbCodeGen kbCompiler kbCPPonly kbVC kbVC400bug kbVC410bug kbVC420bug kbVC500bug kbVC600bug
Version : winnt:4.0,4.1,4.2,5.0,6.0
Platform : winnt
Issue type : kbbug
Last Reviewed: May 17, 1999