C ++:课堂上的歧义

时间:2014-04-30 09:29:29

标签: c++ templates ambiguous

我正在尝试设计这样的类,其中一个是模板类,但我的模糊错误。

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。 我非常感谢帮助:)

1 个答案:

答案 0 :(得分:2)

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

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