2016-11-03 1 views
1

Je souhaite pouvoir lire les quatre premiers entiers d'un fichier, et être capable de les récupérer par leur nom: N, H, C, W. par exemple:Accès aux membres des classes de base avec héritage multiple et modèles

//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 

Le code suivant, tente d'y parvenir en utilisant l'héritage multiple et modèles:

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); 
} 

Je reçois le message d'erreur suivant du compilateur: sur toutes les lignes commençant par res+=fread...

erreur C2664: 'taille_t fread (void *, size_t, size_t, FICHIER )': impossible de convertir l'argument 1 à partir de 'int N :: 'à' void * '

Pourquoi? Des suggestions pour une solution plus élégante?

Répondre

0

&T1::val renvoie un pointeur de membre (à savoir qqch comme N::*), pas un pointeur vers la variable (à savoir int*) comme prévu.

Vous pouvez ajouter this qualificatif pour accéder aux variables membres dans la classe de base, comme:

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);