2017-12-12 8 views
2

私はこのコードを使用するべきだと思いますが、そうではありません!基本クラスの配列メンバ変数を基本クラスのコンストラクタから初期化するクラステンプレート値

class base 
{ 
    std::array<uint8_t, 8> m_ID; 
public: 
    base(std::array<uint8_t, 8> id) :m_ID(id) 
    { 

    } 
} 
template<char ...Ts> 
class derived:base(Ts...) 
{ 
} 
class MyClass: public derived<'1','2','3','4','5','6','7','8'> 
{ 
} 

どうすればいいですか?私はテンプレート値からID値を渡すことができます。

MyClassが完全ではないというエラーが発生しています。 (不完全なタイプが許可されていません)

+0

私は、基数が8個の値の配列を持ち、それがパラメータパックから設定されていることが奇妙であることがわかります。ユーザーが8個以上のパラメータを提供する場合はどうなりますか? –

答えて

3

あなただけの適切基底クラスのコンストラクタを呼び出す必要があります:コンストラクタ初期化子リストで、中括弧の内側のペアは、単一のuint8_t秒に変換するために必要であることを

#include <array> 
#include <cstdint> 

class base 
{ 
    std::array<std::uint8_t, 8> m_ID; 
public: 
    base(std::array<std::uint8_t, 8> id) :m_ID(id) 
    { 

    } 
}; 

template<char ...Ts> 
class derived: public base 
{ 
    public: 
    derived() : base{ { Ts... } } { } 
}; 

class MyClass: public derived<'1','2','3','4','5','6','7','8'> 
{ 
}; 

int main() { 
    MyClass d; 
} 

注意をアレイに。

+0

'MyClass'クラス定義の後にセミコロンを忘れました。そして '(void)MyClass d;'は有効なC++コードではありません。 – Constructor

+0

@コンストラクタSOの回答を自由に改善してください。 – Jodocus

関連する問題