2013-08-24 2 views
-1

Я получаю сообщение об ошибке при попытке написать программу для Arduino. Я новичок в C++, поэтому это очень хорошо может быть чем-то простым и очевидным, что мне не хватает. Я пытаюсь создать простой шаблонный связанный список, но все время сталкиваюсь с проблемами. В моем альбоме я объявлен в своем собственном файле ino. Когда я пытаюсь использовать класс LinkedListItem, я получаю следующую ошибку. Даже если я удалю шаблон, я все равно получаю ту же ошибку.Ошибка Arduino: ISO C++ запрещает объявление 'LinkedListItem' без типа

error: ISO C++ forbids declaration of 'LinkedListItem' with no type 
LinkedList:9: error: expected ';' before '<' token 

И код:

template <class T> 
class LinkedListItem { 

    public: 
    LinkedListItem(T value); 
    T getValue(); 
    LinkedListItem<T>* getPreviousItem(); 
    void setPrevious(LinkedListItem<T>* previous); 
    LinkedListItem<T>* getNextItem(); 
    void setNext(LinkedListItem<T>* next); 

    private: 
    LinkedListItem<T>* _previous; 
    LinkedListItem<T>* _next; 
    T _value; 
}; 

template <class T> 
LinkedListItem<T>::LinkedListItem(T value) { 
    _value = value; 
} 

template <class T> 
T LinkedListItem<T>::getValue() { 
    return _value; 
} 

template <class T> 
LinkedListItem<T>* LinkedListItem<T>::getPreviousItem() { 
    return _previous; 
} 

template <class T> 
void LinkedListItem<T>::setPrevious(LinkedListItem<T>* previous) { 
    _previous = previous; 
} 

template <class T> 
LinkedListItem<T>* LinkedListItem<T>::getNextItem() { 
    return _next; 
} 

template <class T> 
void LinkedListItem<T>::setNext(LinkedListItem<T>* next) { 
    _next = next; 
} 

Я объявляя указатель на LinkedListItem так:

LinkedListItem<String>* _list; 

Любая помощь будет очень высоко ценится.

+0

Вам не нужно указывать аргументы шаблона в 'LinkedListItem ' внутри класса. – chris

+0

Является ли параметр шаблона 'std :: string'? Если это так, 's' должен быть строчным. – Mahesh

+1

Не прерывать ваши исследования, но std :: forward_list тоже существует, если вам нужен только общий список – dans3itz

ответ

1

Возможно, вы назвали «string» вместо «String» из std. После этого изменения компилируется. См. Рабочий код ниже.

#include <string> 

using namespace std; 

template <class T> 
class LinkedListItem { 

    public: 
    LinkedListItem(T value); 
    T getValue(); 
    LinkedListItem<T>* getPreviousItem(); 
    void setPrevious(LinkedListItem<T>* previous); 
    LinkedListItem<T>* getNextItem(); 
    void setNext(LinkedListItem<T>* next); 

    private: 
    LinkedListItem<T>* _previous; 
    LinkedListItem<T>* _next; 
    T _value; 
}; 

template <class T> 
LinkedListItem<T>::LinkedListItem(T value) { 
    _value = value; 
} 

template <class T> 
T LinkedListItem<T>::getValue() { 
    return _value; 
} 

template <class T> 
LinkedListItem<T>* LinkedListItem<T>::getPreviousItem() { 
    return _previous; 
} 

template <class T> 
void LinkedListItem<T>::setPrevious(LinkedListItem<T>* previous) { 
    _previous = previous; 
} 

template <class T> 
LinkedListItem<T>* LinkedListItem<T>::getNextItem() { 
    return _next; 
} 

template <class T> 
void LinkedListItem<T>::setNext(LinkedListItem<T>* next) { 
    _next = next; 
} 

int main() 
{ 
    LinkedListItem<string>* _list; 
    return 0; 
} 

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

+0

Я работаю на борту arduino, у которого есть значительно урезанный набор библиотек. В IDE включена пользовательская строковая библиотека с именем String. Классы std :: string и std :: forward_list недоступны, насколько мне известно. Если они есть, я бы с удовольствием их использовал. – jasonf

+0

@Jasonf: Итак, помог ли мой пост? Включили ли вы класс String в начале файла? Если он находится в пространстве имен, вам тоже нужно его использовать. – lpapp

+0

Извините, но это не сработало. Я также попробовал «LinkedListItem test;», который дал мне ту же ошибку. – jasonf

0

Я не уверен на 100%, что на самом деле решило мою проблему, но в итоге я переместил свой класс LinkedList в свой собственный заголовочный файл, который входит в каталог Arduino/libraries. У меня было объявление класса и реализация разделены на отдельные файлы .h и .cpp, но это потребовало от меня включения обоих файлов для работы моего кода. Итак, я вернул их в один файл .h. Я смоделировал свой класс после библиотеки QueueList http://playground.arduino.cc/Code/QueueList.

Для тех, кто сталкивается с аналогичной проблемой на Arduino, я рекомендую создать свою собственную библиотеку. См. http://arduino.cc/en/Hacking/LibraryTutorial для получения дополнительной информации. Как уже упоминалось выше, я не мог заставить свой код работать, когда был разделен на отдельные файлы .h и .cpp, если я не включил файлы .h и .cpp.

Смежные вопросы