Наследование от шаблона: ошибка области видимости? - PullRequest
0 голосов
/ 16 июля 2011

это мой код:

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

, и у меня есть эта ошибка компилятора

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 *’

Почему компилятор выдает "uno.cpp: 16: ошибка: нет соответствующей функции длявызов 'trj :: push_back (double *) ", если я написал" deque :: push_back (new T [dim]); "в этой строке?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Поскольку deque<T>::push_back ожидает константную ссылку, а вы передаете неконстантный указатель.

Я не могу быть уверен, но я думаю, что вы просто хотите сделатьdeque<T>::resize и передать dim.

0 голосов
/ 16 июля 2011

deque<T>::push_back хочет T, а не массив T с.

Кстати, я бы настоятельно не рекомендовал выводить из deque, поскольку его деструктор-virtual.Если какой-либо код удалит экземпляр вашего класса по указателю на базовый класс, вы получите неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...