I’m confused by this situation and googling didn’t give me the answer. Basically I have the following simple code that doesn’t compile:
#include <iostream>
class A
{
public:
int a(int c = 0) { return 1; }
static int a() { return 2; }
};
int main()
{
std::cout << A::a() << std::endl;
return 0;
}
In compiling this, GCC 4.2 says the call to A::a() in main() is ambiguous with both versions of a() valid candidates. Apple’s LLVM compiler 3.0 compiles with no error.
Why is gcc confused about which function I want to call? I thought it was obvious that by qualifying a() with A:: I’m asking for the static version of the function. Naturally this code still doesn’t compile if I remove the static function a(), because A::a() is not valid syntax for calling the non-static a().
Thanks for any comment!
The reason for this is because C++ specifies that this is ambiguous. Overload resolution specifies that for
A::a, sincethisis not in scope, the argument list in that call is augmented by a contrived A object argument, instead of*this. Overload resolution does not exclude non-static member functions, but insteadThis has recently been subject of extensive discussion both in the committee in context of core issue 1005. See core issue 364 which considered changing this rule but didn’t do so.