2010-12-02 178 views
1

我有這個類雙鏈表:C++編譯錯誤

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

和地方主要

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; 

在錯誤行的錯誤是:

沒有匹配功能調用`Akeraios :: Akeraios(int [((unsigned int)((int)num1len))])'

名候選人是:Akeraios :: Akeraios(常量Akeraios &)

注Akeraios :: Akeraios()與T = INT]

+0

什麼是'num1len`? – 2010-12-02 21:46:17

+0

num1len是整數 - 一個數字的長度長數字,我想我的數組存儲每個數字分開 – Dchris 2010-12-02 21:48:44

回答

0

此代碼是完全合法合規原樣。我可以看到它搞砸的唯一方法是如果你有一個針對VLA的編譯器擴展,並試圖用可變長度的數組調用構造函數,這幾乎肯定會失敗。否則,這是完全合法的。 Visual Studio接受而不爭吵。

1

試試這個:

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

你的編譯器會認爲你按照你所做的方式調用一個函數。

,你也可以使用隱式構造

Akeraios<int> dlist = arr; 

(不是很漂亮,這是)

0

既然你說num1len是一個變量:

模板在編譯時進行評估。當你說arr[num1len]時,你指定了一個長度可變的數組(這是C99還是什麼?)。模板需要一個大小可以在編譯時進行評估的數組(你說的是template<int N>Akeraios(T (&arr) [N]),所以編譯器無法匹配這個數組。

想象一下,你有一個專業化的N = 5或N = 10.編譯代碼時,編譯代碼時如何才能找到合適的分類?