Ошибка вставки связанного списка класса шаблона - PullRequest
0 голосов
/ 03 мая 2011

Когда я пытаюсь вставить этот объект 'food' в список связанных шаблонов моего класса 'test'.Я получаю эту ошибку:

request for member ‘addNode’ in ‘test’, which is of non-class type ‘Catalog<FoodSource>()

Вот мое кодирование, Что я делаю не так?

##main:##

int main(void)
{
    Catalog<FoodSource> test();
    FoodSource food();
    test.addNode(const &food);
    return(0);
}

##function definition in .h:##

template<class T>
class Catalog
{
    public:
        void addNode(const T& value);
};

 ##function implementation in .cpp:##

template <class T>
void Catalog<T>::addNode(const T& value)
{
    Node *temp;

    if(head == NULL)
        head = new Node (value, NULL);
    else
    {
        temp=head;

        while(temp->next !=NULL)
            temp=temp->next;

        temp->next = new Node (value, NULL);
    }
}

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

Вы только что обнаружили одну из многих бородавок, присутствующих в синтаксисе C ++.Стандарт требует, чтобы если выражение можно было интерпретировать как декларацию и как определение, то оно должно рассматриваться как декларация.Например, ваш код

Catalog<FoodSource> test();

не определяет переменную с именем test, а вместо этого объявляет, что существует функция с именем test, которая не принимает аргументов и возвращает Catalog<FoodSource>instance.

Чтобы определить переменную, вам нужно опустить круглые скобки.

Обратите внимание, что в некоторых случаях эту ловушку заметить гораздо сложнее ... например:

double x = 3.14159;
int y(int(x));

как ни удивительно это может показаться в приведенном выше коде y объявлен как функция !

0 голосов
/ 03 мая 2011

При наличии определения для всех классов Node, FoodSource и т. Д. Необходимо выполнить как минимум следующее:

1) Переместить определение функции в файл .h

2) Первая строка в основной функции неоднозначна. Его следует переписать как Catalog<FoodSource> test;, поскольку Catalog<FoodSource> test() будет рассматриваться как прототип функции

0 голосов
/ 03 мая 2011

Объявление и реализация шаблона класса должны быть в одном файле .

Кроме того, вы можете просто позвонить test.addNode(food); в main.

...