【问题标题】:How do I fix "Member is ambiguous" error?如何修复“成员不明确”错误?
【发布时间】:2014-09-23 17:12:54
【问题描述】:

我按照学校的推荐使用 Borland C++ 4.5。 当我尝试运行此代码时,我在尝试运行代码时遇到三个错误。 我每次都尝试更改访问说明符,但都失败了。

#include "iomanip.h"
#include "iostream.h"
#include <conio.h>
#include <stdio.h>

class person
{
public:
    int code;
    char name[50];
    void PEnter()
    {
        cout << "\nEnter Code :\n";
        cin >> code;
        cout << "\nEnter Name :\n";
        gets(name);
    }
};

class account : public person
{
public:
    float pay;
    void AcEnter()
    {
        cout << "\nEnter Pay :\n";
        cin >> pay;
    }
};

class admin : public person
{
public:
    int experience;
    void AdEnter()
    {
        cout << "\nEnter Experience :\n";
        cin >> experience;
    }
};

class master : public account, admin
{
public:
    void MEnter()
    {
        PEnter();
        AcEnter();
        AdEnter();
    }
    void MRet()
    {
        cout << setw(20) << name << "\t" << setw(7) << code << "\t"
             << setw(6) << pay << "\t" << setw(3) << experience << "\n";
    }
};

void main()
{
    clrscr();
    master M[200];
    int i = 0;
    char ch;
    do {
        M[i].MEnter();
        ++i;
        cout << "\nEnter More :\n";
        cin >> ch;
    } while (ch == 'Y' || ch == 'y');
    int j = i;
    clrscr();
    cout << setw(20) << "Name\t" << setw(7) << "Code\t" << setw(6)
         << "Pay\t" << setw(3) << "\tExperience\n";
    for (i = 0; i <= j; ++i) {
        M[i].MRet();
    }
    getch();
}

这是我得到的三个错误:

Error NONAME00.CPP 43 : Member is ambiguous 'person::PEnter' and 'person::PEnter' in function master::MEnter()
Error NONAME00.CPP 49 : Member is ambiguous 'person::name' and 'person::name' in function master::MRet()
Error NONAME00.CPP 49 : Member is ambiguous 'person::code' and 'person::code' in function master::MRet()

我不知道person 类是否被继承(由master 类)。

【问题讨论】:

  • “我按照学校的建议使用 Borland C++ 4.5” 这不是 20 年历史的 IDE 吗?
  • @dyp,是的,差不多 20 年了。当 IDE 和编译器完全 100% 免费且新且实际上符合标准时,为什么有人会推荐它。
  • @user,您已将问题标记为 C++98。这是不正确的。您的代码不是 C++98,而是标准 C++。例如,void main#include "iostream.h"。这个班级/学校对你的伤害比对你的帮助更大。
  • 嘿,IDE 确实有 20 年历史了。但是我们学校的教学大纲告诉我们要遵循 Turbo C++ 或 Borland C++....

标签: c++ c++98


【解决方案1】:

您遇到了diamond inheritance 问题。它是什么以及如何解决这里描述的 virtual inheritance 注意 wiki 示例中的继承与您的非常接近,因此您遵循那里提供的解决方案应该没有任何问题

【讨论】:

  • 我是一个完全的新手,我们的教学大纲没有规定虚函数。有没有其他方法可以解决这个问题??
  • @user3896438 你应该仔细阅读文章,解决方案不是使用虚拟函数而是使用虚拟继承。
【解决方案2】:

也可以将基类继承为虚拟

class admin : public virtual person
class account : public virtual person

【讨论】:

  • 请考虑添加解释为什么这应该起作用。
  • geeksforgeeks.org/virtual-base-class-in-c这个页面很好的解释了为什么我们使用虚拟继承来解决菱形继承问题,避免二义性错误。
  • 对不起,我的意思是把它添加到答案本身(通过点击上面的“编辑”)。直接在答案上添加链接最相关部分的引号会很有帮助(因为链接将来可能会更改/关闭)。
【解决方案3】:

将 fn 称为

person::PEnter();

像这样输入值 -

person::name;
person::code;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 2016-09-06
    • 2021-01-25
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多