符号向量无法解析

问题描述:

#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”的实例匹配参数列表

为什么?谢谢!

+0

数组索引是从零开始的,当初始化矢量时,您可以忽略',0',因为它无论如何都是这样。 – chris 2013-05-10 02:39:26

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) 
{ 
} 
+2

而构造函数需要左值(无法理解为什么),而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

谢谢,你们提到的变化,但仍然有问题在声明:块s(2,2);错误消息是:没有构造函数“block :: block”的实例匹配参数列表 – northfly 2013-05-10 02:46:11

+0

@northfly我增加了更多的信息来解释你为什么看到编译器错误,希望这些帮助。 – taocp 2013-05-10 03:13:55