C++ 矢量关键字"ref"

C++ Vector keyword "ref"

本文关键字:ref 关键字 C++      更新时间:2023-10-16

我想知道在vector类型定义中"ref"的含义是什么

我是c++的新手,在我正在剥离的代码中,我发现了

vector<ref<StupidBug> > bugs;

,其中" StupidBug "是一个类。

它不能在gcc/c++ 11中编译,因为"模板参数">"是无效的",但将">"移动到左边,更接近前一个仍然给出相同的错误

这让我很困惑,我不知道错在哪里了。

代码是几年前写的,会不会写得不好?"ref"属于c++吗?

是一个多向量吗?还是模板?

背景信息:

整个过程是关于在网格中插入和移动"bug",向量保存bug的数量并将它们放置在特定位置。

这里的代码,首先我有一个Stupidbug类
class StupidBug
{
public:
  int x();
  int y();
  // member initialization list
  StupidBug(GraphID_t i=-1): cellID(i) {}
  void move();
  void draw(const eco_string& canvas);
};

带ref的向量在另一个类中:

class Model: public Space
{
public:
urand u;     //random generator for positions
int tstep;   //timestep - updated each time moveBugs is called
int scale;   //no. pixels used to represent bugs
vector<ref<StupidBug> > bugs;
 addBugs(int nBugs);
void addBugs();
void moveBugs();
void draw(TCL_args args);
};

谢谢你的回答!

又一个阻止using namespace std;的理由

是函数模板std::ref<T>

vector<ref<StupidBug> >不能编译,因为std::vector期望一个类型(实际上是2个类型,但另一个是默认的),而您提供了一个函数std::ref<StupidBug>


这可能是你的旧项目有另一个ref模板,不知何故,当用c++ 11编译时,它选择std::ref而不是那个模板。

我几乎可以肯定,它是一个用户定义的类,类似于智能指针,被设计用来替代不能与std::vector类一起使用的标准类std::auto_ptr

这个类可能使用对象的引用计数。

现在不是

vector<ref<StupidBug> > bugs;

你可以写

vector<std::unique_ptr<StupidBug> > bugs;

注意这两个">"符号的记录

vector<std::unique_ptr<StupidBug> > bugs;
                               ^^^^

这意味着代码是根据c++ 2003标准编译的,当时除了std::auto_ptr之外没有新的智能指针不能与向量一起使用。

在旧的c++标准中有一个与std::auto_ptr相关的问题。因此,在新的c++标准中引入了新的智能指针,如std::unique_ptrstd::shared_ptr,它们可以与std::vector和其他标准容器一起使用。

使用这个类是因为代码是旧的,新标准还没有采用它的新类,或者它可能具有标准中没有的功能,或者更适合某些类的任务。

在那个时候,例如Scott Meyers在他的书More Effective C++中展示了如何编写带有引用计数的智能指针。这个主题在c++ 2003标准发布的时候很流行。:)

很明显,这与同样在c++ 2011中引入的标准函数std::ref没有任何共同之处,除了它的名字。:)

编写代码时,没有标准函数std::ref .:)

只需查看定义类的头文件:)

根据c++标准(D.10 auto_ptr)

类模板auto_ptr已弃用。[注:类模板。Unique_ptr(20.7.1)提供了一个更好的解决方案。-end note]

因此,由于新的c++标准中引入了新的智能指针,似乎没有必要再使用这个用户定义的类ref。

感谢您的回答,我能够解决这个问题。

实际上代码是2006年的,使用的是c++03标准

ref<StupidBug> 

是一个模板,用作自定义智能指针,带有一些额外的函数,而不是" std::ref "函数。它定义在一个名为" classdesc "

的头文件中

由于某些原因,即使我没有使用"使用命名空间std",编译器也会使用"ref"函数而不是模板。

我一直在使用

classdesc::ref<StupidBug>

是原始模板所在的" classdesc "。

使用c++ 11中的新智能指针(shared_ptr)也不能工作,因为原始模板中有额外的函数。

我不知道@莫斯科的vlad和@StoryTeller谁更正确....