我遇到了arduino c和StandardCplusplus软件包的问题。我试图声明一个向量,但得到以下错误:
Node.h:26:错误:ISO C ++禁止声明'vector',没有类型
Node.h:26:错误:无效使用'::'
Node.h:26:错误:预期';'在'<'之前令牌
在查看其他问题时,here或here人忘记了包含或使用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 ++禁止声明'vector',没有类型
Node.h:13:错误:无效使用'::'
Node.h:13:错误:预期';'在'&lt;'之前令牌
答案 0 :(得分:3)
我刚遇到同样的问题并且能够通过在我的主草图.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
答案 1 :(得分:1)
您是否阅读过文档?来自http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus,
我可以在AVR上使用C ++吗?
基本上是的,支持C ++(假设你的编译器已被配置和编译以支持它,当然)。以.cc,.cpp或.C结尾的源文件将自动导致编译器前端调用C ++编译器。或者,可以通过名称avr-c ++显式调用C ++编译器。
但是,目前还没有对libstdc ++的支持,libstdc ++是完整C ++实现所需的标准支持库。这对可编译的C ++程序施加了许多限制。
答案 2 :(得分:0)
使用编译器的-E
选项预处理文件,并删除编译器会抱怨的内容,如-c
和-o
。由于您没有展示如何编译代码,因此无法建议调用应该如何准确。请注意,输出必须很大,即您应该将其重定向到文件或将其管道为less
。
处理完文件后,检查Node
类中的声明是否仍然读取原始内容(结果的确切结果取决于编译器)。特别要确认std
并没有神奇地消失(
如果该行看起来OK,请检查是否正确包含了<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
作为包含保护,不太可能定义,但我不知道您的标题正在做什么。