2011-07-16 4 views
0

ceci est mon code:Héritage d'un modèle: erreur d'étendue?

#include<stdarg.h> 
#include<deque> 
using namespace std; 
template<typename T,int dim> 
class trj:public deque<T>{ 
public: 
    void push_back(T,...); 
    virtual void set_calculate_method(int)=0; 
};             

template<typename T,int dim>      
class bb:public trj<T,dim>{        
public:                   
    void set_calculate_method(int);          
}; 

template<typename T,int dim>     
void trj<T,dim>::push_back(T in,...){ 
    va_list ap;       
    T aux;        
    va_start(ap,in);      
    aux=in;        
    deque<T>::push_back(new T[dim]);  
    for(int i=0;i<dim;i++){    
     *(deque<T>::back()+i)=aux;  
     aux=va_arg(ap,T);    
    }                 
    va_end(ap);       
}          

int main(){            
    bb<double,3> t;          
    t.push_back(2,3,4);                 
    return 0;            
}               

et j'ai cette erreur du compilateur

uno.cpp: In member function ‘void trj<T, dim>::push_back(T, ...) [with T = double, int dim = 3]’: 
uno.cpp:57: instantiated from here 
uno.cpp:16: error: no matching function for call to ‘trj< double, 3 >::push_back(double*)’ 
/usr/include/c++/4.4/bits/stl_deque.h:1201: note: candidates are: void std::deque <_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = double, _Alloc = std::allocator<double>] 
uno.cpp:57: instantiated from here 
uno.cpp:18: error: invalid type argument of ‘unary *’ 

Pourquoi le compilateur émette "uno.cpp: 16: Erreur: pas de fonction concordante pour appel à « Trj < double, 3> :: push_back (double *) "si j'ai écrit" deque < T> :: push_back (nouveau T [dim]); "dans cette ligne?

Répondre

0

deque<T>::push_back veut T, pas tableau de T s. Par ailleurs, je déconseillerais vivement de dériver de deque, car son destructeur est non virtuel. Si du code supprime une instance de votre classe par un pointeur vers la classe de base, vous obtiendrez un comportement indéfini.

1

Car deque<T>::push_back attend une référence const et vous passez un pointeur non const.

Je ne peux pas être sûr, mais je pense que vous voulez juste faire un deque<T>::resize et passer en dim.

+0

il arrive que j'hérite du public que je passais pour repousser un T *. Le compilateur me comfuse! Merci, –