G ++编译器不能用同名来区分变量和函数吗?

时间:2011-12-20 21:54:38

标签: c++ compiler-construction naming-conventions method-names

  

可能重复:
  Class method and variable with same name, compile error in C++ not in Java?

当我的类成员名称和成员函数名称相同时,G ++编译器会抱怨。似乎每当变量名称恰好与函数名称相同时,编译器就会抱怨。

在Java中,情况并非如此。我只是想知道为什么G ++编译器无法区分变量名和函数名,因为函数名总是带有一对括号。

2 个答案:

答案 0 :(得分:8)

struct Callable
{
    void operator()() const { }
};

struct Test
{
    void Call() { }
    Callable Call;
};

int main()
{
    Test x;
    x.Call(); // To which 'Call' does this refer?
}

答案 1 :(得分:3)

这有两个原因:

  • 变量可能会超载operator()
  • 可以使用地址或创建引用函数(使用其名称而不使用相关函数调用()

在第一种情况下,variable()会做什么?在第二种情况下,编译器必须通过操作的返回类型来确定正确的操作 - C ++不允许出于各种原因。