2016-11-03 6 views
1

ファイルから最初の4つの整数を読み込み、N、H、C、Wの名前で取得できるようにします。例えば :私は次のコンパイラエラーメッセージが表示されます複数の継承とテンプレートを持つ基本クラスのメンバにアクセス

struct N{ int val; }; 
struct C{ int val; }; 
struct H{ int val; }; 
struct W{ int val; }; 

struct DataFormat : N, C, H, W 
{ 
    template<class T1, class T2, class T3, class T4> 
    bool read_header(FILE* p_file) 
    { 
     int res = 0; 
     res += fread(&T1::val, sizeof(int), 1, p_file); //doesn't compile 
     res += fread(&T2::val, sizeof(int), 1, p_file); //doesn't compile 
     res += fread(&T3::val, sizeof(int), 1, p_file); //doesn't compile 
     res += fread(&T4::val, sizeof(int), 1, p_file); //doesn't compile 
     return (res != 0); 
    } 
    int getN(){ return N::val; } 
    int getC(){ return C::val; } 
    int getH(){ return H::val; } 
    int getW(){ return W::val; } 
}; 


static void foo(){ 

    DataFormat data_format; 
    FILE* some_file; 
    data_format.read_header<N, W, H, C>(some_file); 
} 

:すべての行にres+=fread...

から始まる

//some_file.mat: {10,20,30,40.....} 
data_format.read_header<N,C,W,H>(some_file.mat); 
cout << data_format.getN(); // prints the first read integer: 10 
cout << data_format.getH(); // prints the fourth read integer: 40 

data_format.read_header<C,N,H,W>(some_file.mat); 
cout << data_format.getN(); // prints the second read integer: 20 
cout << data_format.getH(); // prints the fourth read integer: 30 

次のコードは、多重継承とテンプレートを使用してこれを達成しようとします

エラーC2664: 'size_t fread(void *、size_t、size_t、FILE )':できません 引数1から 'int N :: 'から' void * '

なぜですか? より洗練されたソリューションのご提案ですか?

答えて

0

&T1::val部材ポインタN::*等即ちSTH)、ではないあなたが期待どおりに、可変(すなわちint*)へのポインタを戻します。

あなたが好き、基底クラスのメンバ変数にアクセスするthis修飾子を追加することができます。

res += fread(&this->T1::val, sizeof(int), 1, p_file); 
res += fread(&this->T2::val, sizeof(int), 1, p_file); 
res += fread(&this->T3::val, sizeof(int), 1, p_file); 
res += fread(&this->T4::val, sizeof(int), 1, p_file); 
関連する問題