ошибка компиляции c ++ - PullRequest
       5

ошибка компиляции c ++

1 голос
/ 03 декабря 2010

У меня есть этот класс для двойных связанных списков:

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 &)

note Akeraios :: Akeraios () [с T = int]

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

попробуйте это:

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

ваш компилятор думает, что вы вызываете функцию, делая это так, как вы это делаете.

вы также можете использовать неявный конструктор

Akeraios<int> dlist = arr;

(не очень приятно это)

0 голосов
/ 03 декабря 2010

Поскольку вы говорите, что num1len - это переменная:

Шаблоны оцениваются во время компиляции.Когда вы говорите arr[num1len], вы указываете массив с переменной длиной (это C99 или что-то?).Шаблон ожидает массив с размером, который может быть оценен во время компиляции (вы говорите template<int N>Akeraios( T (&arr) [N]), поэтому компилятор не сможет это сопоставить.

Представьте, что у вас есть специализация для N =5 или N = 10. Как компилятор сможет найти правильную специализацию при компиляции кода, если размер массива неизвестен в этот момент?

0 голосов
/ 03 декабря 2010

Этот код является абсолютно действительным и совместимым как есть. Единственный способ, которым я могу видеть это, - это если у вас есть расширение компилятора для VLA и вы пытаетесь вызвать конструктор с массивом переменной длины, который почти наверняка потерпит неудачу. В противном случае это совершенно законно. Visual Studio принимает без ссоры.

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