无法解析符号向量

时间:2013-05-10 02:36:07

标签: c++ class 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),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”的实例与参数列表匹配

为什么呢?谢谢!

2 个答案:

答案 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)
{
}