C ++语句无法解析重载函数的地址

时间:2014-08-07 22:01:54

标签: c++

好吧,它非常基本但我放弃了。我只是想检查一个问题的答案: compilator会抗议吗?

cell->unregister();
cell.erase();

所以我用c ++编写了一个最简单的脚本来检查:

/*
* main.cpp
*
 *  Created on: Aug 7, 2014
 *      Author: luke
 */
#include <iostream>
#include <cstdlib>
using namespace std;

class abs
{
    int a,b;

public:
    void unregister(){
        a = 0;
        b = 0;
    }
    void erase(){
        a = 2;
        b = 0;
    }
    abs(int c,int d);
};
abs::abs(int c,int d){
    a = c;
    b = d;
}
int main () {
    abs obj(4, 2);

    obj->unregister();
    obj.erase();
}

我得到的错误是:

  

描述资源路径位置类型语句无法解析   重载函数main.cpp /测试行32的地址C / C ++问题

     

描述资源路径位置类型方法&#39;取消注册&#39;不能   解决main.cpp /测试行34语义错误

     

描述资源路径位置类型方法&#39;擦除&#39;不可能   已解决的main.cpp /测试行35语义错误

     

描述资源路径位置类型make: * [main.o]错误   1测试C / C ++问题

     

描述资源路径位置类型预期';'之前   'obj'main.cpp /测试行32 C / C ++问题

     

描述资源路径位置类型'obj'未在此声明   范围main.cpp /测试行34 C / C ++问题

7 个答案:

答案 0 :(得分:2)

它应该是obj.unregister();,因为obj是一个实际的对象而不是指向对象的指针。

答案 1 :(得分:2)

是的,编译器应该抗议这一行:

obj->unregister();

' - &gt;'运算符与指针一起使用,而这里不是。它应该是:

obj.unregister();

答案 2 :(得分:2)

obj不是指针,因此->运算符不会对其起作用。请改用.

obj->unregister();

答案 3 :(得分:2)

你有两个问题:

1) absC standard function,您在#include <cstdlib>时将其包含在您的计划中。您的班级abs的名称与此功能相冲突。

2) obj->unregister应该是obj.unregister(),因为obj是一个对象,而不是一个指针。


<强>解决方案:

  • 为您的班级abs
  • 选择其他名称
  • 或者在你的namespace中声明。

Live demo

答案 4 :(得分:2)

正如您所看到的,编译器确实提出了抗议。 ->在这里不起作用。 obj->unregister();(*obj).unregister();的简写 它在堆上初始化对象时起作用,链接此

abs1 * obj = new abs1(4, 2);
obj->unregister(); // obj.unregister(); will not work
obj->erase();

您在堆栈上初始化了对象;所以 - &gt;不会工作只有“。”会工作:

abs1 obj(4, 2);
obj.unregister(); // obj->unregister(); will not work
obj.erase();

更新:我更新了示例以使用与系统函数相同的名称更正abs的问题,在其他答案中指出。

答案 5 :(得分:1)

主要有两个问题:

  1. 访问指针
  2. abs是一个C函数,那么你需要指出它是一个类(更好地重命名)
  3. 这将解决两个问题:

    int main () {
        class abs obj(4, 2);
    
        obj.unregister();
        obj.erase();
    }
    

答案 6 :(得分:1)

该程序有两个错误。 首先,以与函数名称相同的方式命名类是一个坏主意。 您包含标题<cstdlib>,其中包含标准C函数abs的声明。此函数名称隐藏了类abs。 要解决此问题,您必须在语句

中使用详细的类名
abs obj(4, 2);

那就是你必须写

class abs obj(4, 2);

第二个错误是使用成员访问运算符->而不是。那就是你必须写

obj.unregister();

而不是

obj->unregister();