2013-08-24 83 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'嗎?如果是這樣,'''應該是小寫。 – Mahesh

+1

不要打斷你的學習,但std :: forward_list確實存在,如果你只是需要一個通用列表 – dans3itz

回答

1

您可能意思是來自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中相應的鏈表,除非你有一個你尚未提到的具體要求。

+0

我正在研究一個arduino板,它有一套相當精簡的庫。 IDE包含一個名爲String的自定義字符串庫。據我所知,std :: string和std :: forward_list類是不可用的。如果是的話,我會很樂意使用它們。 – jasonf

+0

@Jasonf:那麼,我的帖子有幫助嗎?你有沒有在文件的開頭加入你的String類?如果它位於命名空間中,則也需要使用它。 – lpapp

+0

對不起,這沒有奏效。我也試過'LinkedListItem 測試;'這給了我同樣的錯誤。 – 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文件時工作。

相關問題