ISO C++禁止声明没有类型的"矢量"

ISO C++ forbids declaration of 'vector' with no type

本文关键字:类型 矢量 C++ 禁止 声明 ISO      更新时间:2023-10-16

我与arduino C和standardcplusplus软件包有问题。我正在尝试声明矢量,但会收到以下错误:

node.h:26:错误:ISO C 禁止没有类型的"向量"声明

node.h:26:错误:使用'::'

的使用无效

node.h:26:错误:预期';''<''令牌

查看其他问题,在这里或这里人们忘记了包括或使用性标准,但我已经做到了。

/*
 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中包含的文件中:

node.h:13:错误:ISO C 禁止" vector"声明,没有类型

node.h:13:错误:无效使用'::'

node.h:13:错误:预期';'在'&lt;'之前令牌

我只是遇到了同一问题,并且能够通过在我的主要草图.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 编译器。另外,C 编译器可以通过名称AVR-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用作包括Guard,不太可能定义,但我不知道您的标题在做什么。