2017-08-10 10 views
1

さまざまなオブジェクトを格納できる一般的なストレージクラスを用意したいと思います。それらをすべて格納する異種コンテナクラスを使用したくありません。私は、テンプレートストレージ・クラスを作成すると考えると、これは、異なるタイプとメタクラスを継承する一般的なストレージ・クラスを作成します。以下のようにテンプレートクラスからの多重継承

template<typename Type> 
struct SingleInterface 
{ 
public: 
    SingleInterface() = default; 
    virtual ~SingleInterface() = default; 
    SingleInterface(const SingleInterface &) = default; 
    SingleInterface & operator=(const SingleInterface &) = default; 
    SingleInterface(SingleInterface &&) = default; 
    SingleInterface & operator=(SingleInterface &&) = default; 

    void get(const std::string & keyword, Type * ptr) 
    { 
     // implementation 
    } 

}; 

私の一般的なクラス:

class MutliInterface: public SingleInterface<double>, SingleInterface<int> 
{ 
public: 
    MutliInterface() = default; 
    virtual ~MutliInterface() = default; 
}; 

私はMutliInterfaceクラスを作成します

MutliInterface interface; 
double *v; 
interface.get("test", v); 

'get' is ambiguous '

+0

getメソッドに入力してください。あいまいさを解決しますか? void get(const std :: string&keyword、Type * ptr) – apramc

答えて

4

01との両方のオーバーロードを公開:、私は次のエラーを取得します派生クラスで声明:

class MutliInterface: public SingleInterface<double>, SingleInterface<int> 
{ 
public: 
    MutliInterface() = default; 
    virtual ~MutliInterface() = default; 
    using SingleInterface<double>::get; 
    using SingleInterface<int>::get; 
}; 

それは基本的に機能getの名前は、クラスMutliInterface、候補のセットですぐに見つからない場合と言うことを理由[class.member.lookup]のあいまいなのです関数は、クラスの基本クラスを使用して作成されます。しかし、関数は同一でなければなりません。そうでなければ、あいまいです(ここでは同じではありません)。

ここでusingキーワードを使用すると、そのすべてをショートカットし、両方のオーバーロードに派生クラスからすぐにアクセスできます。