【问题标题】:C++: Ambiguity in classC++:类中的歧义
【发布时间】:2014-04-30 09:29:29
【问题描述】:

我正在尝试设计这样的类,其中一个是模板类,但我遇到了模棱两可的错误。

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::basic_string]|

/Projekt v1.0/base.h|17|注:无效 Base::sortByStr(std::string (v::*)()) [with v = Worker;标准::字符串 = std::basic_string]|

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

【问题讨论】:

    标签: c++ templates ambiguous


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,我在这样的实现中得到了同样的错误信息。 :(也许是编译器的错?或者我需要更多的虚拟继承?
    • 这样的虚拟继承不会有帮助,因为会生成两个不同的类:Base 和 Base,它们都有一个 sortByStr 方法。
    • Rakibul:是的,同样的错误。 @undermind:那你有什么建议?
    • @juniorro,您可以明确告诉编译器它应该使用哪个版本的函数。例如:Base&lt;Worker&gt;::sortByStr(&amp;Worker::getPosition).
    • @undermind 它有效 :) 我的意思是,至少没有错误。谢谢!
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多