2016-10-13 15 views
-1

私の問題は少し奇妙で、私はそれに対する答えを見つけることができません。私は今、私は私を実装したい)私のプロトコルネストされたテンプレートクラスの継承

template <template<class TMessage> class TFrame, class TMessage> 
    class Protocoll 
    { 
     ... 
    } 

2)私は私のフレームとメッセージ

class MessageImpl : public Message 
    { 
     ... 
    } 

    class FrameImpl : public Frame<MessageImpl> 
    { 
     ... 
    } 

3の実装を持っているため、ネストされたテンプレートクラスを持っている

1)フレームとメッセージのための実装を使用しています。

class ProtocolImpl : public Protocol<FrameImpl, MessageImpl> 
    { 
     ... 
    } 

コンパイラは最初のテンプレートパラメータ "FrameImpl"について不平を言っています。これは(明らかに)汎用テンプレート型ではないからです。

これをコンパイルする可能性はありますか? ヘッダーに実装する必要があるため、私は 'FrameImpl'汎用/テンプレートを作成したくありません。

どうもありがとう

編集:

完全なサンプル要求するのであるので: "ProtocolImpl" の宣言で

//--------------------- definitions 

    class Message 
    { 
    public: 
     virtual ~Message() = default; 
     virtual void foo() noexcept = 0; 
    }; 

    template <class Message> 
    class Frame 
    { 
    public: 
     virtual ~Frame() = default; 
     virtual void foo() noexcept = 0; 
    }; 

    template <template<class TMessage> class TFrame, class TMessage> 
    class Protocol 
    { 
    public: 
     virtual ~Protocol() = default; 
     virtual void foo() noexcept; 
    }; 

    //--------------------- implementations 

    class MessageImpl : public Message 
    { 
    public: 
     void foo() noexcept 
     { } 
    }; 

    class FrameImpl : public Frame<MessageImpl> 
    { 
    public: 
     FrameImpl() 
     : message{ } 
     { } 

     void foo() noexcept 
     { 
     message.foo(); 
     } 
    private: 
     MessageImpl message; 
    }; 

    class ProtocolImpl : public Protocol<FrameImpl, MessageImpl> 
    { 

    }; 

を、私は、テンプレートの種類としてフレームを渡すことができますが、 FrameImplではありません。

+1

問題を再現する[MCVE]を提供してください。 –

答えて

0

あなたは

template <typename> 
using FrameImplT = FrameImpl; 

class ProtocolImpl : public Protocol<FrameImplT, MessageImpl> 
{ 
    // ... 
}; 

を行うことができます。しかし、これらのテンプレートパラメータの目的が何であるかで考えます。

関連する問題