无法解析符号向量

Symbol vector could not be resolved

本文关键字:符号 向量      更新时间:2023-10-16
#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"的实例与参数列表匹配

为什么?谢谢!

首先:

  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&引用非常量长整型,这是左值引用。根据这个博客:左值,右值和参考

左值引用

(非常量类型(是可以使用左值初始化的引用。好吧,只有那些不呈现常量或可变类型的左值。右值引用(对非 const 类型(是可以使用右值初始化的引用(同样,仅使用那些不指定常量或可变类型的右值(。对 const 类型的左值引用是可以使用 rvalues 和 lvalues 进行初始化的引用(呈现常量和非常量类型(。

此外,根据C++11标准:第4.1节标准转换:

标准转换是为内置类型定义的隐式转换。标准转换序列是以下标准转换序列 次序:

— 从以下集合进行零个或一个转换:左值到右值转换、数组到指针转换、 和函数到指针的转换。

— 从以下集合进行零个或一个转换:积分提升、浮点提升、积分 转换、浮点转换、浮点转换、指针转换、指针指向 成员转换和布尔转换。

— 零或一次资格转换。

没有右值到左值的转换。这就是您看到编译错误的原因。在long&之前添加const使其能够使用右值初始化,这就是更改后错误消失的原因。

其次

  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

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