[英]ISO C++ forbids declaration of 'vector' with no type
我在使用arduino c和StandardCplusplus軟件包時遇到問題。 我正在嘗試聲明一個向量,但出現以下錯誤:
Node.h:26:錯誤:ISO C ++禁止聲明無類型的“向量”
Node.h:26:錯誤:無效使用'::'
Node.h:26:錯誤:預期';'在'<'標記之前
在其他問題上,人們在這里或這里忘記了include或use std,但是我都做到了。
/*
Node.h
*/
#ifndef Node_h
#define Node_h
#include "Arduino.h"
#include <StandardCplusplus.h>
#include <vector>
#include <string>
#include <iterator>
class Node
{
public:
Node(int size);
~Node();
float bias();
void set_bias(float);
void print();
void fprint(FILE *);
float compute(std::vector<float> inputs);
void setWeights(std::vector<float> inws);
void set_weight(int,float);
float dutyCycle();
protected:
std::vector<float> _weights; //input weights:30
float level;
void init(int size);
std::vector<int> firelog;
};
#endif
謝謝
編輯:我正在使用arduino 1.5.5 ide編譯器。
edit2:我刪除了除矢量以外的所有內容,按注釋產生:
/*
Node.h
*/
#ifndef Node_h
#define Node_h
#include <vector>
class Node
{
public:
Node();
~Node();
std::vector<int> test;
};
#endif
仍然輸出錯誤:
在Node.cpp包含的文件中:1:
Node.h:13:錯誤:ISO C ++禁止聲明無類型的“向量”
Node.h:13:錯誤:無效使用'::'
Node.h:13:錯誤:預期為';' 在“ <”令牌之前
我遇到了同樣的問題,並且能夠通過在我的主要草圖.ino文件中包含StandardCplusplus.h來解決此問題,而不是在要使用該向量的C ++類頭文件中包含它。因此,它看起來大致像這樣:
/*
Main.ino (or whatever your main sketch file is called)
*/
#include <StandardCplusplus.h>
#include "Node.h"
// ...
void setup()
{
}
void loop()
{
}
然后在Node.h中:
/*
Node.h
*/
#ifndef Node_h
#define Node_h
#include <vector>
class Node
{
public:
Node();
~Node();
std::vector<int> test;
};
#endif
您閱讀過文檔嗎? 從http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus ,
我可以在AVR上使用C ++嗎?
基本上可以,C ++受支持(當然,假設您的編譯器已配置並編譯為支持它)。 以.cc,.cpp或.C結尾的源文件將自動導致編譯器前端調用C ++編譯器。 或者,可以使用名稱avr-c ++顯式調用C ++編譯器。
但是,目前不支持libstdc ++,這是完整C ++實現所需的標准支持庫。 這對可以編譯的C ++程序施加了許多限制。
使用編譯器的-E
選項預處理文件,並刪除編譯器會抱怨的東西-c
和-o
。 由於您沒有顯示如何嘗試編譯代碼,因此無法建議調用的外觀。 注意,輸出必然很大,即,您應該將其重定向到文件或通過管道傳遞給less
。
處理完文件后,檢查Node
類中的聲明是否仍讀取原始內容(確切的結果取決於編譯器)。 特別要確認std
沒有神奇消失(
如果該行看起來不錯,請檢查是否正確包含了<vector>
標頭。 您應該能夠對行匹配#.*vector
進行細化,例如,在我的機器的預處理輸出中看起來像這樣:
# 1 "/opt/gcc-current/include/c++/4.9.0/vector" 1 3
在那行之后,您應該期望std::vector
模板的實際聲明(嗯,在某些時候;它可能首先包含其他標頭)。 如果編譯器找到另一個文件,該文件恰好被稱為vector
,則std::vector
的聲明可能會丟失。
另一個候選者可能是為<vector>
標頭定義包含保護的對象。 那將在上面找到其位置的vector
文件的代碼之前。 例如,文件/opt/gcc-current/include/c++/4.9.0/vector
使用_GLIBCXX_VECTOR
作為包含保護,不太可能定義,但我不知道您的標頭在做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.