gpt4 book ai didi

C++:类中的歧义

转载 作者:行者123 更新时间:2023-11-30 04:05:11 25 4
gpt4 key购买 nike

我正在尝试设计这样的类,其中之一是模板类,但我遇到了不明确的错误。

template <class v>
class Base
{
protected:
vector <v> data;

void sortByStr (string (v::*) () );

};

class Person : Base <Person>
{
string szSurname;
string szPhoneNum;

public:
Person (string surname = "default", string phoneNum = "000 000 000")
: szSurname (surname), szPhoneNum (phoneNum)
{
};

virtual void sortBySurname() {sortByStr (&Person::getSurname);};
virtual void sortByPhone() {sortByStr (&Person::getPhone);};
};


class Worker : public Base <Worker>,
public Person
{
private:
string szPosition;
int nAge;
bool isBusy;

public:
Worker (string surname = "Not Specified",
string phone = "000-000-000",
string position = "none",
short age = 0,
bool busy = 0);
: Person (surname, phone), szPosition (position), nAge (age), isBusy (busy)
{};

void sortByPosition(){sortByStr (&Worker::getPosition);}; // <-sortByStr ambiguous
void sortByAge() {sortByNum (&Worker::getAge);}; // <-sortByStr ambiguous
void sortByStatus() {sortByBool(&Worker::getBusyStatus);}; // <-sortByStr ambiguous



};

我得到:

/Projekt v1.0/people.h||In member function ‘void Worker::sortByPosition()’:|

/Projekt v1.0/people.h|76|error: reference to ‘sortByStr’ is ambiguous|

/Projekt v1.0/base.h|17|note: candidates are: void Base::sortByStr(std::string (v::*)()) [with v = Person; std::string = std::basic_string]|

/Projekt v1.0/base.h|17|note: void Base::sortByStr(std::string (v::*)()) [with v = Worker; std::string = std::basic_string]|

是否可以在这个具体示例中避免此类错误?我试图(仅用于检查)将类 Worker 实现为仅派生自 Base。它有效,但我需要在我的项目中访问 Worker 中的 Person。我真的很感谢帮助:)

最佳答案

这是因为Base类在Worker类中被继承了两次,一次直接继承,一次继承自Person类,因为它也继承了Base。所以在类 worker 中有两个 Base::sortByStr() 方法的拷贝,一个来自 Person(它从 Base 获取),一个来自 Base 本身,因此编译器混淆了调用哪个。为避免这种情况,您可以对类 Person 使用虚拟继承。

      class Person: virtual public Base<Person> { ...};

关于C++:类中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23384437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com