Error list is not a template

Does anyone have any insight in to how this error occurs? I made a LinkedList a template in C++ and in my main method I have this code: List list; list.insert(1, 9); And I am getting t...

Does anyone have any insight in to how this error occurs? I made a LinkedList a template in C++ and in my main method I have this code:

List<int> list;
list.insert(1, 9);

And I am getting this error on the first line:

`List' is not a template

I am including this file:

template <typename T>
class List
{
public:
       List();
       List(const List& aList);
       ~List();

       bool isEmpty() const;
       int getLength() const;
       void insert(int index, const T& newItem);
       void remove(int index);
       void retrieve(int index, T& dataItem) const;

private:
        struct ListNode
        {
               T item;
               ListNode *next;
        };

        int size;
        ListNode *head;

        ListNode *find(int index) const;
};

Not posting the implementation file for spacial reasons but I am post individual functions if necessary.

I tried changing List(const List& aList); to List(const List<T>& aList); but that didn’t really change anything. Templating syntax confuses me >.<

asked Apr 27, 2011 at 4:08

Guelgosh Puanetham's user avatar

13

Are you sure that your List template class is not in a different namespace?

Have you tried renaming your template class to something unique to ensure you are instantiating the class you think you are?

answered Jun 1, 2011 at 12:55

zennehoy's user avatar

3

In my projects I declare list like this to avoid the error

    using namespace std;
    #include <list>

answered Jan 30, 2020 at 16:01

Gary Walkey's user avatar

3

Is it possible that you wrote the template code in the .cpp file?

I’m going of by this line:

Not posting the implementation file

Template code can only ever be in the .h file, there can be no «implementation file».
The reasons are as complicated, as they are silly :)

answered Jun 1, 2011 at 12:59

x10's user avatar

x10x10

3,7801 gold badge23 silver badges32 bronze badges

1

There are a couple of problems with your code: The first is that you don’t declare any variable named list_a anywhere. That error should be pretty obvious. The other is that you use the List class without giving it template parameters.

And last a small note about your question: As your files are indeed very small, you could put them in the question and not link to them.

Edit: About the List template problem.

You already use Node properly in List, i.e. declare the nodes as Node<T>. When you use List you simply has to do the same. For example, to declare a list of integers:

List<int> my_int_list;

Also, as you only use public functions in List from the class A, you don’t need the friend declaration. If you do need to use protected or private members (which IMO is a sign of bad design) you need to make that friend-declaration templated as well:

friend class List<sometype>;

And finally, your code will not compile anyway… The reason being that when you are using a template-class, the whole class has to be fully defined (i.e. complete with its function implementations). You can solve this by putting the functions in the header file. And when defining the functions, you need the template parameter there as well:

template<typename T>
void List<T>::Add(const T& el)
{
    Node<T>* head = new Node<T>(el);
    if ( Compare(el,i) > i )
        std::cout << "Ok" << std::endl;
}

Note that I added the template parameter in a couple of places.

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    >
    как подружиться с шаблоном класса. Ошибка «is not a template type»

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    27.09.09, 04:36

      Здравствуйте!

      Сижу мудрю. И кажись намудрил. Код вроде бы простой, а компилер ругаеться.

      Цитата

      error: `list_string’ is not a template type

      Подскажите, пожалуйста, где я тупанул?!

      Сообщение отредактировано: Eric-S — 29.09.09, 05:09


      Adil



      Сообщ.
      #2

      ,
      27.09.09, 06:19

        Ты ведь не h-файл компилируешь, а срр? Приводи и его код. Только не лепи свои портянки с закомментированным кодом во весь файл, а выкинь всё лишнее и приведи минимальный код, воспроизводящий ошибку.
        Кстати, пока это делаешь, обычно сам находишь, что не так. :)

        Добавлено 27.09.09, 06:24
        Как правильно задавать вопросы


        Eric-S



        Сообщ.
        #3

        ,
        29.09.09, 04:57

          Я нашол проблемное место.
          Но справиться с ним не могу.

          Ошибка возникает, когда я делаю шаблонный класс другом.

          Вот минимальный код, доводящий до ошибки.

          ExpandedWrap disabled

            // дочерний класс

            class child

            {

            private:

            // это и приводит к ошибке

            friend class base;

            child* prev;

            child* next;

            };

            // шаблон базового класса

            template< class T >

            class base

            {

            public:

            T* add()

            {

            T* c = new T();

            c->prev = 0;

            c->next = 0;

            return c;

            }

            };

            // инстанцируем

            template class base< child >;

            typedef base<child> b;

            int main()

            {

            return 0;

            }

          Наверое, надо, как-то не так френдить.
          Он ведь просит параметры шаблона.
          Но, я даже не представляю, откуда их взять!
          Предполагаеться, что класс child должен быть унаследован и стать базовым классом. И в шаблон будет передаваться уже именно тот новый класс.

          Добавлено 29.09.09, 05:33
          О! Поздравьте меня. Я догадался!

          ExpandedWrap disabled

            template< class T >

            friend class base;

          И ведь так элементарно!

          Сообщение отредактировано: Eric-S — 29.09.09, 05:34

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • C/C++: Общие вопросы
          • Следующая тема

          Рейтинг@Mail.ru

          [ Script execution time: 0,0213 ]   [ 16 queries used ]   [ Generated: 9.02.23, 14:20 GMT ]  

          Я новичок в C ++, поэтому, пожалуйста, извините меня, если мои ошибки ниже окажутся глупыми. Тем не менее, я придерживаюсь своего кода и буду признателен за любую помощь.

          Я получаю следующую ошибку при попытке компиляции через make через g ++:

          In file included from A.cpp:2:
          List.h:20: error: ‘List’ is not a template type
          A.cpp: In member function ‘void A::NowyObiekt(int)’:
          A.cpp:6: error: ‘list_a’ was not declared in this scope
          make: *** [A.o] Error 1
          

          Мой код разделен на следующие крошечные файлы:

          • A.h: http://pastebin.com/QQ04xx2j (заголовок)
          • A.cpp: ниже

            #include "A.h"
            #include "List.h"
            
            void A::NewObject(int i)
            {
                    list_a.Add(i);
            }
            
            int A::Compare(int a, int b)
            {
                    if ( a>b ) return 1;
                    if ( a<b ) return -1;
                    else return 0;
            }
            
          • List.h: ниже (заголовок)

            #ifndef LIST_H
            #define LIST_H
            template<typename T>
            class Node
            {
                Node()
                {
                    nxt = pre = 0;
                }
                Node(const T& el, Node *n = 0, Node *p = 0 )
                {
                    dana = el; nxt = n; pre = p;
                }
                T dana;
                Node *nxt, *pre;
            };
            
            template<typename T>
            class List
            {
            public:
                List()
                {
                    head = tail = 0;
                }
                void Add(const T&);
            protected:
                Node<T> *head,*tail;
            };
            
            #endif
            
          • List.cpp: http://pastebin.com/a3HQ9yZ4

          • prog.cpp: ниже (основной)

            #include "List.h"
            #include "A.h"
            
            int main()
            {
                int i = 5;
                class List list_a;
                class A obj;
            
                obj.Add(i);
            }
            
          • а файл makefile: http://pastebin.com/GTR5jW54

          Как уже отмечалось, я все еще новичок, поэтому, пожалуйста, проявите понимание. Буду благодарен за любую помощь и ясные объяснения. Заранее спасибо.

          1 ответ

          Лучший ответ

          В вашем коде есть пара проблем: во-первых, вы нигде не объявляете переменную с именем list_a. Эта ошибка должна быть довольно очевидной. Во-вторых, вы используете класс List, не задавая ему параметров шаблона.

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

          Изменить: О проблеме с шаблоном List.

          Вы уже правильно используете Node в List, т.е. объявляете узлы как Node<T>. Когда вы используете List, вы просто должны делать то же самое. Например, чтобы объявить список целых чисел:

          List<int> my_int_list;
          

          Кроме того, поскольку вы используете только общедоступные функции в List из класса A, вам не нужно объявление friend. Если вам действительно нужно использовать защищенные или закрытые члены (что IMO является признаком плохого дизайна), вам также необходимо сделать это объявление друга по шаблону:

          friend class List<sometype>;
          

          И, наконец, ваш код все равно не будет компилироваться … Причина в том, что когда вы используете шаблонный класс, весь класс должен быть полностью определен (т.е. в комплекте с его реализациями функций). Вы можете решить эту проблему, поместив функции в файл заголовка. И при определении функций вам также понадобится параметр шаблона:

          template<typename T>
          void List<T>::Add(const T& el)
          {
              Node<T>* head = new Node<T>(el);
              if ( Compare(el,i) > i )
                  std::cout << "Ok" << std::endl;
          }
          

          Обратите внимание, что я добавил параметр шаблона в нескольких местах.


          4

          Some programmer dude
          19 Апр 2012 в 09:35

          Есть пара проблем с вашим кодом: во-первых, вы не объявляете какую-либо переменную с именем list_a любом месте. Эта ошибка должна быть довольно очевидной. Другой заключается в том, что вы используете класс List не задавая ему параметры шаблона.

          И последнее небольшое примечание о вашем вопросе: поскольку ваши файлы действительно очень маленькие, вы можете поставить их в вопрос, а не ссылаться на них.

          Изменить: проблема с шаблоном List.

          Вы уже правильно используете Node в List, т.е. Объявляете узлы как Node<T>. Когда вы используете List вы просто должны сделать то же самое. Например, чтобы объявить список целых чисел:

          List<int> my_int_list;

          Кроме того, поскольку вы используете только публичные функции в List из класса A, вам не требуется объявление friend. Если вам нужно использовать защищенных или закрытых членов (что ИМО является признаком плохого дизайна), вам необходимо также добавить эту декларацию для друзей:

          friend class List<sometype>;

          И, наконец, ваш код не будет компилироваться в любом случае… Причина в том, что когда вы используете шаблонный класс, весь класс должен быть полностью определен (т.е. Полный с его реализациями функций). Вы можете решить эту проблему, поместив функции в файл заголовка. А при определении функций вам нужен параметр шаблона:

          template<typename T>
          void List<T>::Add(const T& el)
          {
          Node<T>* head = new Node<T>(el);
          if ( Compare(el,i) > i )
          std::cout << "Ok" << std::endl;
          }

          Обратите внимание, что я добавил параметр шаблона в несколько мест.

          Я пытаюсь скомпилировать заголовочный файл, но получаю ошибки, которые не могу понять.

          Я хочу создать структуру, которая содержит 3 карты:
          -карта от отдельных слов до счета
          -карта из пар слов в счет
          -карта из отдельных слов в список следующих слов

          Код в моем заголовочном файле:

          #include <cstdlib>
          #include <iostream>
          #include <cstring>
          #include <string>
          #include <cctype>
          #include <vector>
          #include <algorithm>
          #include <map>
          
          typedef struct {
          
          std::map<std::string, int> firstCounts;
          std::map<std::string, int> pairCounts;
          std::map<std::string, std::list<std::string>> follows; //You can use an iterator to retrieve the values stored in the list.
          
          } LanguageModel;
          

          И ошибки, которые я получаю:

          >   LangModel.h:24:23: error: ‘list’ is not a member of ‘std’
          >      std::map<std::string, std::list<std::string>> follows; //You can use an iterator to retrieve the values stored in the list.
          >                            ^
          >     LangModel.h:24:23: error: ‘list’ is not a member of ‘std’
          >     LangModel.h:24:38: error: template argument 2 is invalid
          >      std::map<std::string, std::list<std::string>> follows; //You can use an iterator to retrieve the values stored in the list.
          >                                           ^
          >     LangModel.h:24:38: error: template argument 4 is invalid
          >     LangModel.h:24:44: error: expected unqualified-id before ‘>’ token
          >      std::map<std::string, std::list<std::string>> follows; //You can use an iterator to retrieve the values stored in the list.
          

          4

          Решение

          Вы забыли добавить

          #include <list>
          

          10

          Другие решения

          Как насчет #include <list>? Вам не хватает включения заголовка.

          4

          Понравилась статья? Поделить с друзьями:
        • Error linker link exe not found
        • Error ld returned 1 exit status как исправить linux
        • Error ld returned 1 exit status как исправить codeblocks
        • Error ld returned 1 exit status code blocks
        • Error launching unity player