C++ 矢量关键字"ref"
C++ Vector keyword "ref"
我想知道在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_ptr
或std::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谁更正确....
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 对RValue对象调用的LValue ref限定成员函数
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 将Ref对象作为类成员
- 为什么我的 std::ref 无法按预期工作?
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 如何@ref同一方法的不同变体?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- 与 C++ 相比使用 C# 'ref' 关键字
- C++ 矢量关键字"ref"
- C#通过引用(ref关键字)问题