2010-12-02 174 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.编译代码时,编译代码时如何才能找到合适的分类?