ISO C++禁止使用未指定类型的“vector”声明

5
我在使用arduino c和StandardCplusplus包时遇到了问题。我试图声明一个向量,但出现了以下错误:
Node.h:26: 错误: ISO C++禁止在没有类型的情况下声明“vector” Node.h:26: 错误: 无效的使用'::' Node.h:26: 错误: 在“<”标记之前预期';'
查看其他类似问题的解决方案,如这里这里,人们会忘记包含头文件或使用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编译器。

编辑2:根据评论,我已经删除了除向量以外的所有内容,即:

/*
 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:错误:在“<”符号之前应有“;”


1
下划线开头的名称是保留的,如果我没记错的话。但这可能不是问题所在。 - StoryTeller - Unslander Monica
4
这个头文件 #include <StandardCplusplus.h> 在这里的作用是什么? - Vlad from Moscow
你尝试过检查向量包含文件,确保它实际存在,并且不是空文件或以某种方式损坏了吗? - crush
除非头文件 "Arduino.h"<StandardCplusplus.h> 搞出了什么奇怪的事情,否则看起来应该可以编译。我建议使用普遍存在的 -E 选项对文件进行预处理,然后查看有问题的行变成了什么。 - Dietmar Kühl
1
错误在一个包含的头文件中,错误消息被剥离:-1。 - user2249683
显示剩余5条评论
3个回答

3

我刚遇到了同样的问题,并通过在我的主要sketch .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

你有阅读文档吗?来自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++,但没有任何使语言强大的东西。 - Jon Trauntvein
1
没错,这就是为什么我试图使用StandardCplusplus。这个软件包允许在Arduino上使用std。 - Steven Stangle

0

使用编译器的-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 作为包含保护,但这不太可能被定义,我不知道你的头文件在做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接