我正在尝试设计这样的类,其中一个是模板类,但我的模糊错误。
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 ||在成员函数'void 工人:: sortByPosition()”:|
/ Projekt v1.0 / people.h | 76 |错误:引用'sortByStr'是 暧昧|
/ Projekt v1.0 / base.h | 17 |注意:候选人是:无效 Base :: sortByStr(std :: string(v :: *)())[with v = Person;的std :: string = std :: basic_string] |
/ Projekt v1.0 / base.h | 17 |注意:无效 Base :: sortByStr(std :: string(v :: *)())[with v = Worker;的std :: string = std :: basic_string] |
在此具体示例中是否可以避免此类错误? 我试图(仅用于检查)实现类Worker仅从Base派生。它有效,但我需要在我的项目中访问来自Worker的Person。 我非常感谢帮助:)
答案 0 :(得分:2)
这是因为类Base在类Worker中继承两次,一个直接从类Person继承,因为它也继承了Base。所以在类worker中有两个Base :: sortByStr()方法的副本,一个来自Person(它从Base获取),一个来自Base本身,因此编译器会混淆哪一个调用。为避免这种情况,可以对类Person使用虚拟继承。
class Person: virtual public Base<Person> { ...};