我在尝试为Arduino编写程序时出错。我是C++的新手,所以这可能是我所缺少的简单而明显的东西。我试图创建一个简单的模板链接列表,但一直遇到问题。在我的写生本中,我在自己的ino文件中声明了以下内容。当我尝试使用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;
如有任何帮助,我们将不胜感激。
您可能指的是std中的"string"而不是"string"。更改后,它将编译。请参阅下面的工作代码。
#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中相应的链表,除非您有尚未提及的特定要求。
我不能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文件。