2010-12-02 7 views
1

J'ai cette classe pour les listes doubles liées:C++ erreur de compilation

template <typename T> 
class Akeraios 
{ 
    struct node 
    { 
     T data; 

     node* prev; 

     node* next; 

     node(T t, node* p, node* n) : data(t), prev(p), next(n) {} 

    }; 

    node* head; 

    node* tail; 

public: 

    Akeraios() : head(NULL), tail (NULL) {} 

    template<int N> 

    Akeraios(T (&arr) [N]) : head(NULL), tail (NULL) //meta apo : simainei einai initializer list--arxikopoiisi listas 
    { 
     for(int i(0); i != N; ++i) 

      push_back(arr[i]); 

    } 

    bool empty() const { return (!head || !tail); } 
    operator bool() const { return !empty(); } 
    void push_back(T); 
    void push_front(T); 
    T pop_back(); 
    T pop_front(); 

    ~Akeraios() 
    { 
     while(head) 
     { 
      node* temp(head); 
      head=head->next; 
      delete temp; 
     } 
    } 
}; 

et quelque part dans le principal

int arr[num1len]; 

    int i=1; 

    Akeraios <int> dlist (arr);//error line!! 

    for(i=1;i<=num1len;i++){ 

    double digit; 

    int div=10; 

    int j; 

    for(j=1;j<=i;j++)div=div*div; 


    digit=number1/div; 

    int dig=(int) digit; 

l'erreur dans la ligne d'erreur est:

pas de fonction concordante pour appel à `Akeraios :: Akeraios (int [((entier non signé) ((int) num1len))]) '

candidats sont: Akeraios :: Akeraios (const Akeraios &)

notes Akeraios :: Akeraios() [avec T = int]

+0

Qu'est-ce que 'num1len'? –

+0

num1len est un entier - la longueur des chiffres d'un long nombre et je veux mon tableau pour stocker chaque chiffre séparé – Dchris

+0

@ user501986: Est-ce une constante ou une variable? – Puppy

Répondre

0

Ce code est parfaitement valide et conforme en l'état. La seule façon dont je peux le voir se gâcher est si vous aviez une extension de compilateur pour les VLAs et avez essayé d'appeler le constructeur avec un tableau de longueur variable, ce qui échouerait presque certainement. Sinon, c'est parfaitement légitime. Visual Studio accepte sans se quereller.

+0

qui m'a aidé beaucoup merci! – Dchris

+0

@ user501986: Si ma réponse a résolu votre problème, alors m ark comme accepté. – Puppy

1

essayez ceci:

Akeraios <int>* dlist = new Akeraios(arr); 

votre compilateur pense appelez une fonction en la faisant comme vous le faites.

vous pouvez aussi utiliser le constructeur implicite

Akeraios<int> dlist = arr; 

(pas très agréable c'est)

0

Puisque vous dites que num1len est une variable:

Les modèles sont évalués à la compilation. Quand vous dites arr[num1len], vous spécifiez un tableau avec une longueur variable (est-ce C99 ou quelque chose?). Le modèle attend un tableau avec une taille qui peut être évaluée au moment de la compilation (vous dites template<int N>Akeraios(T (&arr) [N]), donc le compilateur ne peut pas égaler cela.)

Imaginez que vous ayez une spécialisation pour N = 5 ou N = 10. Comment le compilateur pourrait-il trouver la bonne spécialisation lors de la compilation du code si la taille du tableau n'est pas connue à ce point?