2

sayhello私は 2 つのポリシーを取るホスト クラスを持っていますtalk。ポリシーtalkはクラス テンプレートであり、それ自体がたとえばsayhello. 問題は、sayhello::saySomethingがあいまいであることですhost2(このダイヤモンドの問題を で解決しようとしましたvirtual)。

このあいまいさをどのように解決できますか? または、一般に、そのような問題に対するより良い設計はありますか?

例:

#include <iostream>

class sayhello {
protected:
    void saySomething(void) {
        std::cout<<"Hello!"<<std::endl;
    }
};

template<typename T>
class talk : private T {
protected:
    void doSomething(void) {
        T::saySomething();
    }
};

template<typename T>
class host1 : virtual T {
public:
    void hostAction(void) {
        T::doSomething();
    }
};

template<typename T, typename L>
class host2 : private T, private L {
public:
    void hostAction(void) {
        T::doSomething();
        L::saySomething();
    }
};

int main() {
    host1<talk<sayhello> > HOST1;
    HOST1.hostAction(); // ok that works

    host2<talk<sayhello>,sayhello> HOST2;
    HOST2.hostAction(); // error, ambiguity!

    return 0;
}
4

2 に答える 2

2

おそらく継承を悪用していますが、 と の両方にさらにいくつかのvirtualキーワードを追加してください:talkhost2

#include <iostream>

class sayhello {
protected:
    void saySomething(void) {
        std::cout<<"Hello!"<<std::endl;
    }
};

template<typename T>
class talk : virtual T {
protected:
    void doSomething(void) {
        T::saySomething();
    }
};

template<typename T>
class host1 : virtual T {
public:
    void hostAction(void) {
        T::doSomething();
    }
};

template<typename T, typename L>
class host2 : virtual T, virtual L {
public:
    void hostAction(void) {
        T::doSomething();
        L::saySomething();
    }
};

int main() {
    host1<talk<sayhello> > HOST1;
    HOST1.hostAction(); // ok that works

    host2<talk<sayhello>,sayhello> HOST2;
    HOST2.hostAction(); // error, ambiguity!

    return 0;
}

実際の例

于 2013-10-19T22:38:03.150 に答える
1

ダミー クラスを追加できます。

template<typename T> struct dummy : T {};

template<typename T, typename L>
class host2 : private T, private dummy<L> {
public:
    void hostAction(void) {
        T::doSomething();
        dummy<L>::saySomething();
    }
};

場合によってはL、次のように直接キャストする必要があります。

L& getL()
{
    return static_cast<L&>(static_cast<dummy<L>&>(*this));
}
于 2013-10-19T22:36:46.980 に答える