ISO C ++禁止在没有类型的情况下声明'vector'

时间:2014-01-28 22:11:44

标签: c++ arduino

我遇到了arduino c和StandardCplusplus软件包的问题。我试图声明一个向量,但得到以下错误:

  

Node.h:26:错误:ISO C ++禁止声明'vector',没有类型

     

Node.h:26:错误:无效使用'::'

     

Node.h:26:错误:预期';'在'<'之前令牌

在查看其他问题时,herehere人忘记了包含或使用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;'之前令牌

3 个答案:

答案 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作为包含保护,不太可能定义,但我不知道您的标题正在做什么。