【问题标题】:ISO C++ forbids declaration of 'vector' with no typeISO C++ 禁止声明没有类型的“向量”
【发布时间】:2014-01-28 22:11:44
【问题描述】:

我在使用 arduino c 和 StandardCplusplus 包时遇到问题。我正在尝试声明一个向量,但出现以下错误:

Node.h:26: 错误:ISO C++ 禁止声明没有类型的“向量”

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

Node.h:26: 错误:预期 ';'before '

看其他问题,herehere 人忘记了 include 或使用 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:我已经根据 cmets 删除了除矢量以外的所有内容:

/*
 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: 错误: 预期 ';'在'之前

【问题讨论】:

  • 命名约定不一致是怎么回事? set_weightsetWeights...
  • 保留下划线开头的名称,如果有记忆的话。但这可能不是。
  • 这个ideone example 似乎工作正常。有什么我们没有在这里看到的吗?
  • 这个头文件#include 在这里做什么?!
  • 错误在包含的标头中并且错误消息被剥离:-1

标签: c++ arduino


【解决方案1】:

我刚刚遇到了同样的问题,并且能够通过在我的主草图 .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

【讨论】:

    【解决方案2】:

    您阅读过文档吗?来自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++ 程序施加了许多限制。

    【讨论】:

    • 我在这里读到的是,您可以在 Arduino 上使用 C++,但没有任何东西可以让语言变得强大。
    • 对,这就是我尝试使用 StandardCplusplus 的原因,这是一个允许在 arduino 上执行 std 的包。
    【解决方案3】:

    使用编译器的-E 选项预处理文件并删除编译器会抱怨的内容,例如-c-o。由于您没有展示您如何尝试编译代码,因此无法建议调用应该看起来如何准确。请注意,输出一定会很大,也就是说,您应该将其重定向到一个文件或将其通过管道传输到 less 之类的东西。

    处理完文件后,检查Node 类中的声明是否仍然读取与原始文件类似的内容(具体结果取决于编译器)。特别要确认std 没有神奇地消失(

    如果该行看起来正常,请检查 &lt;vector&gt; 标头是否正确包含。您应该能够精确匹配 #.*vector 的行,例如,在我机器上的预处理输出中看起来像这样:

    # 1 "/opt/gcc-current/include/c++/4.9.0/vector" 1 3
    

    在该行之后,您会期望std::vector 模板的实际声明(嗯,在某些时候;它可能首先包含其他标题)。如果编译器发现另一个文件恰好称为vector,则std::vector 的声明可能已经丢失。

    另一个候选对象可能是定义 &lt;vector&gt; 标头的包含保护的东西。那将在上面找到其位置的vector 文件的代码之前。例如,文件/opt/gcc-current/include/c++/4.9.0/vector 使用_GLIBCXX_VECTOR 作为包含保护,这不太可能被定义,但我不知道你的标题在做什么。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多