符号向量无法解析
#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;
}
编译和错误消息显示符号“向量”无法解析。什么是错误?我想定义一个包含可变维矢量的类来初始化。符号向量无法解析
#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”的实例匹配参数列表
为什么?谢谢!
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)
{
}
而构造函数需要左值(无法理解为什么),而rvalues通过。 – soon 2013-05-10 02:42:07
首先:
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&
是对非常量long的引用,它是左值引用。根据这个博客:lvalues, rvalues and references
一个左值引用(非const类型)是一个可以用左值初始化的引用。那么,只有那些不呈现const或volatile类型的左值。右值引用(对于非const类型)是一个可以用右值初始化的引用(同样,只对那些不指定const或volatile类型的右值)。对const类型的左值引用是一个可以用rvalues和lvalues相同的方法初始化的引用(呈现常量和非常量类型)。
此外,根据C++ 11标准:4.1节标准转换:
标准转化是内置类型定义隐式转换。标准转换序列是以下 命令中的一系列标准转换:
- 从以下集合中进行零或一次转换:左值到右值转换,阵列到指针转换,以及函数 - 指针转换。
- 零或者选自以下组的一个转换:积分促销,浮点推广,积分 转换,浮点转换,浮积分转换,指针转换,指针 构件转换,和布尔转换。
- 零或一个合格转换。
没有右值到左值的转换。这就是你看到这个编译错误的原因。在long&
之前添加const
可以使用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
数组索引是从零开始的,当初始化矢量时,您可以忽略',0',因为它无论如何都是这样。 – chris 2013-05-10 02:39:26