-1

尝试为 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;

任何帮助将不胜感激。

4

2 回答 2

1

您可能指的是“字符串”而不是 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 中的相应链表。

于 2013-08-24T04:47:05.863 回答
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 文件时,我无法让我的代码工作。

于 2013-08-24T21:40:59.840 回答