【问题标题】:C++ compile time error: expected identifier before numeric constantC++ 编译时错误:数字常量之前的预期标识符
【发布时间】:2022-03-06 11:13:55
【问题描述】:

我读过其他类似的帖子,但我只是不明白我做错了什么。我认为我对向量的声明是正确的。我什至试图在没有尺寸的情况下声明,但即使这样也不起作用。出了什么问题? 我的代码是:

#include <vector> 
#include <string>
#include <sstream>
#include <fstream>
#include <cmath>

using namespace std;

vector<string> v2(5, "null");
vector< vector<string> > v2d2(20,v2);

class Attribute //attribute and entropy calculation
{
    vector<string> name(5); //error in these 2 lines
    vector<int> val(5,0);
    public:
    Attribute(){}

int total,T,F;

};  

int main()
{  
Attribute attributes;
return 0;
}

【问题讨论】:

  • 在调用vector 构造函数时,你想用50 做什么?以下是参数的含义:cplusplus.com/reference/stl/vector/vector
  • 我只是想使用:显式向量 ( size_type n, const T& value= T(), const Allocator& = Allocator() );如您的链接所示:vector second (4,100);
  • @Ajay:糟糕的想法,std 库是 C++ 的一部分,你当然应该学会一起使用它们。
  • @KillianDS,库不是语言 (IMO) 的一部分,它们只是标准化的。 printfcout 不是语言概念,它们来自库。我的意思是 OP 他/她必须先学习基础知识!

标签: c++ vector g++


【解决方案1】:

你不能这样做:

vector<string> name(5); //error in these 2 lines
vector<int> val(5,0);

在方法之外的类中。

您可以在声明时初始化数据成员,但不能使用() 括号:

class Foo {
    vector<string> name = vector<string>(5);
    vector<int> val{vector<int>(5,0)};
};

在 C++11 之前,您需要先声明它们,然后在构造函数中初始化它们

class Foo {
    vector<string> name;
    vector<int> val;
 public:
  Foo() : name(5), val(5,0) {}
};

【讨论】:

  • 哪个编译器支持“C++11”特性?
  • @Ajay GCC 自 4.7 起,请参阅 here,可能是最新的 clang。不知道 VS 的发布时间表是什么,但我听说最新版本将支持所有功能。
  • @Jason 在类中的方法内部是您可以执行此操作的地方之一。您也可以在非成员函数中执行此操作,或者在声明全局变量时执行此操作。
  • @juanchopanza 明白了,谢谢!请问为什么不能对类中的类变量执行此操作,而我们可以对全局变量执行此操作
  • @Jason 这个想法是为了避免出现声明数据成员可以像函数一样解析的情况。循环“最令人头疼的解析”。
【解决方案2】:

不允许在类主体中使用(...) 进行初始化。使用{..}= ...。不幸的是,由于各自的构造函数是 explicit 并且 vector 有一个初始化列表构造函数,你需要一个函数转换来调用想要的构造函数

vector<string> name = decltype(name)(5);
vector<int> val = decltype(val)(5,0);

作为替代方案,您可以使用构造函数初始化列表

 Attribute():name(5), val(5, 0) {}

【讨论】:

    【解决方案3】:

    由于您的编译器可能还不支持所有支持类似语法的 C++11,因此您会遇到这些错误,因为您必须在构造函数中初始化您的类成员:

    Attribute() : name(5),val(5,0) {}
    

    【讨论】:

    • 提供的语法在C++11中也不起作用,在声明变量时只允许brace-or-equal初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多