簡體   English   中英

C ++編譯錯誤

[英]c++ compile error

我有此類的雙鏈表:

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(const Akeraios&)

注意Akeraios :: Akeraios()[with T = int]

嘗試這個:

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

您的編譯器認為您正在按照自己的方式調用函數。

您還可以使用隱式構造函數

Akeraios<int> dlist = arr;

(這不是很好)

此代碼是完全有效的,並且符合原樣。 我看到的唯一混亂的方法是,如果您具有VLA的編譯器擴展,並嘗試使用可變長度數組來調用構造函數,這幾乎肯定會失敗。 否則,這是完全合法的。 Visual Studio不加爭吵地接受。

因為您說的是num1len是一個變量,所以:

模板在編譯時進行評估。 當您說arr[num1len] ,您要指定一個長度可變的數組(這是C99還是其他?)。 模板期望一個數組,該數組的大小可以在編譯時求值(您說的是template<int N>Akeraios( T (&arr) [N]) ,因此編譯器無法將其匹配。

試想一下,您有一個專門化的N = 5或N = 10。 如果當時還不知道數組的大小,編譯器將如何在編譯代碼時找到合適的專業化?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM