因此,我想知道为什么以下钻石问题的代码片段无法编译。我知道这个问题通常通过虚拟继承来解决,但我故意没有使用它。这段代码只是为了展示我的问题,即为什么编译器会调用这个模棱两可的函数:所以我在struct Base中声明了两个成员变量,因为这两个子类(在这种情况下是结构体)没有虚拟继承,我将在每个派生结构中引用Base成员。现在我有一个叫做AllDer的另一个结构体,它将遇到两次知道id_和name_的问题。然而,当我明确从Base目标id_和name_时,我不明白为什么这会是模棱两可的,因为直接目标变量是通过::-运算符指定的。
有人能告诉我,为什么编译器在这里出了问题吗?(请原谅可能错误的技术术语) 编译器错误信息显示:“从派生类'AllDer'到基类的转换不明确”。使用MinGW 7.3.0 64位C++和QT Creator。 编辑:由于这个问题似乎被不同的编译器处理方式不同,请查看链接的问题。
cout << Der1::Base::id_ << Der1::Base::name_ << '\n';
有人能告诉我,为什么编译器在这里出了问题吗?(请原谅可能错误的技术术语) 编译器错误信息显示:“从派生类'AllDer'到基类的转换不明确”。使用MinGW 7.3.0 64位C++和QT Creator。 编辑:由于这个问题似乎被不同的编译器处理方式不同,请查看链接的问题。
#include <string>
#include <iostream>
using std::string; using std::cout;
struct Base
{
int id_;
string name_; //target members for readAllDer() in AllDer
void read()
{
cout << id_ << ' ' << name_ << '\n';
}
};
struct Der1 : public Base
{
//Der1 has own reference to id_, name_
void readDer1()
{
cout << id_ << name_ << '\n';
}
};
struct Der2 : public Base
{
//Der2 has own reference to id_, name_
void readDer2()
{
cout << id_ << name_ << '\n';
}
};
//
struct AllDer : public Der1, public Der2
{
void readAllDer()
{
cout << Der1::Base::id_ << Der1::Base::name_ << '\n'; // Why is this ambiguous?
}
};
Base::
的情况下工作,嗯。 - Yksisarvinen