#include <iostream>
#include <vector>
using namespace std;
class block{
public:
long nx,ny;
vector<long> s;
block(long &x, long &y):nx(x),ny(y),vector<long> s((x+1)*(y+1),0) {}
};
int main() {
block B(2,2);
for(int i=1;i<=9;i++) {
cout<<B.s(i);
}
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
编译和错误消息显示无法解析符号“vector”。这是什么错误?我想定义一个包含可变维度向量的类来初始化。
#include <iostream>
#include <vector>
using namespace std;
class block{
public:
long nx,ny;
vector<long> s;
block(long &x, long &y):nx(x),ny(y),s((x+1)*(y+1),0) {}
};
int main() {
block B(2,2);
for(int i=0;i<=9;i++) {
cout<<B.s[i];
}
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
在B区(2,2)仍有问题;错误消息:没有构造函数“block :: block”的实例与参数列表匹配
为什么呢?谢谢!
答案 0 :(得分:4)
首先:
vector<long> s((x+1)*(y+1),0)
应该是:
s((x+1)*(y+1),0)
不应重复s
的类型。
同时构造函数应该是:
block(const long &x, const long &y):
nx(x), ny(y), s((x + 1) * (y + 1), 0)
{
}
如果你真的需要参考。否则,当你这样做时
block B(2,2);
在main
内,它会给你错误,因为构造函数需要long&
,你传递的是int常量。关于这个的深层原因与左值和右值有关:整数常量是右值,但是long&
是对非常量长的引用,它是左值引用。根据这篇博客:lvalues, rvalues and references
左值引用(非const类型)是可以使用左值初始化的引用。好吧,只有那些不渲染const或volatile类型的左值。右值引用(对于非const类型)是可以使用rvalue初始化的引用(同样,仅使用那些不指定const或volatile类型的rvalue)。对const类型的左值引用是一个可以使用rvalues和lvalues进行初始化的引用(呈现常量和非常量类型)。
此外,根据C ++ 11标准:第4.1节标准转换:
标准转化是为内置类型定义的隐式转化。标准转换序列是以下标准转换序列 顺序:
- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换, 和函数到指针的转换。
- 来自以下集合的零或一次转换:整数促销,浮点促销,积分 转换,浮点转换,浮点积分转换,指针转换,指针指向 成员转换和布尔转换。
- 零或一个资格转换。
没有右值到左值的转换。这就是您看到编译错误的原因。在const
之前添加long&
使其能够使用rvalues进行初始化,这就是更改后错误消失的原因。
其次,
cout<<B.s(i);
应该是:
cout<<B.s[i];
您应该使用[]
来访问向量元素。
第三,向量索引从0
开始,所以
for(int i=1;i<=9;i++)
应该是
for(int i=0;i<9;i++)
否则,索引越界。请在此处查看工作示例:http://ideone.com/YLT3mG
答案 1 :(得分:3)
block(long &x, long &y):nx(x),ny(y),vector<long> s((x+1)*(y+1),0) {}
不要在初始化列表中重复vector<long>
。也没有理由传递引用,所以删除&符号。
block(long x, long y):
nx(x), ny(y), s((x + 1) * (y + 1), 0)
{
}