Arduino 错误:ISO C++禁止声明无类型的'LinkedListItem'

Arduino error: ISO C++ forbids declaration of 'LinkedListItem' with no type

本文关键字:类型 LinkedListItem 声明 错误 ISO C++ 禁止 Arduino      更新时间:2023-10-16

我在尝试为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文件。