编译器未将向量识别为类成员
Posted
技术标签:
【中文标题】编译器未将向量识别为类成员【英文标题】:compiler not recognizing vector as class member 【发布时间】:2016-03-11 06:25:48 【问题描述】:enter image description here我正在尝试一些 STL 程序。我已经在 main 中声明了一个向量并尝试运行它正在运行的程序,但是如果我在类中声明了相同的(向量),那么就会出现编译错误。我认为编译器无法识别向量(在类中声明)。
我尝试过 std:: 仍然是同样的错误。我正在使用 netbeans IDE 和 cigwin 编译器。
请在下面找到代码
#include <cstdlib>
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
/*
*
*/
class vectorcl
vector<int> v(10);
int i;
public:
vectorcl();
void add_vector();
void dis_vector();
;
vectorcl :: vectorcl()
for(i =0;i<10 ;i++)
v[i] = 0;
void vectorcl :: dis_vector()
cout<< " The vale is : \n";
for(i =0;i<10 ;i++)
cout << "\t " <<v[i];
void vectorcl :: add_vector()
for (i =0 ; i<10; i++)
v[i] = i+1;
int main(int argc, char** argv)
// vector<int> vp(10);
// for(int j =0;j<10 ;j++)
//
// cout << " " << vp[j];
//
vectorcl v1;
v1.dis_vector();
v1.add_vector();
v1.dis_vector();
return 0;
请帮助我,我的问题是为什么我的编译器无法识别在类中声明的向量。
错误:数字常量之前的预期标识符 数字常量前应为 ',' 或 '...'
Error
【问题讨论】:
请编辑您的问题以显示实际的错误消息,完整、完整且未经编辑。 这可能不应该有 java 作为标签。 关于您的问题的提示:您需要阅读有关构造函数成员初始化列表。 最后一个不相关的提示:不要将成员变量用于应该是局部变量的东西。成员变量i
应该是你使用的函数中的一个局部变量。
【参考方案1】:
您不能使用vector<int> v(10);
作为成员变量。解决方案是将其替换为vector<int> v;
并添加此更改构造函数,如下所示:
vectorcl::vectorcl():
v(std::vector<int>(10,0/* This 0 is instead of the for-loop*/))
或者另一种选择是将其声明为:
std::vector<int> v = std::vector<int>(10);
附:无需将 int i 声明为类成员。只需在您需要的每个函数中声明它即可。
【讨论】:
你不需要那个循环。 @juanchopanza 当然可以。我只是按照OP所写的方式保留它。我要编辑谢谢【参考方案2】:乍一看,您是在尝试调用类原型中的构造函数:vector<int> v(10);
。除非您使用成员初始化列表,否则该类的构造函数将在您的包装类构造函数中调用。
编辑:使用成员初始化
vectorcl :: vectorcl(): v(10)
【讨论】:
真正的问题是语法无效。这会起作用:vector<int> v = vector<int>(10);
你确定这真的会改变什么吗?这将调用 v 的复制构造函数,就像 vector<int>(10)
调用它的构造函数一样。无论如何,这两者都是真正糟糕的设计。
它会改变一些东西,因为它会工作,而不是甚至不编译。但是不,那时它不会调用构造函数。构造只发生在实例化时。
向量项是值初始化的,这个循环是多余的
@Russley Shaw:感谢您的诚实回答。我对 STL 很陌生,正在尝试一些矢量..希望将来我的设计会更好以上是关于编译器未将向量识别为类成员的主要内容,如果未能解决你的问题,请参考以下文章
C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组