簡體   English   中英

C ++:類中的歧義

[英]C++: Ambiguity in class

我正在嘗試設計這樣的類,其中一個是模板類,但是卻出現了模棱兩可的錯誤。

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 Worker :: sortByPosition()':|中

/ Projekt v1.0 / people.h | 76 |錯誤:對“ sortByStr”的引用不明確|

/ Projekt v1.0 / base.h | 17 |注意:候選對象為:void Base :: sortByStr(std :: string(v :: *)())[with v = Person; std :: string = std :: basic_string] |

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

在此特定示例中是否可以避免此類錯誤? 我試圖(僅用於檢查)實現僅從Base派生的Worker類。 它可以工作,但是我需要在項目中從“工作人員”訪問“人員”。 我非常感謝您的幫助:)

這是因為Base類在Worker類中繼承了兩次,一次直接繼承,另一次從Person類繼承,因為它也繼承了Base。 因此,在類worker中有Base :: sortByStr()方法的兩個副本,一個副本來自Person(從Base獲取),一個副本來自Base本身,因此編譯器很困惑要調用哪個。 為避免這種情況,可以對類Person使用虛擬繼承。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM