繁体   English   中英

ISO C ++禁止声明无类型的“向量”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM